2010-08-23 100 views
6
struct B1{ 
    int d; 
    void fb(){}; 
}; 

struct B2 : B1{ 
    using B1::d; 
    using B1::fb; 

    int d;    // why this gives error? 
    void fb(){}   // and this does not? 
}; 

int main(){} 

是因爲,B1::fb()B1::fb(B1*)and B2::fb()B2::fb(B2*)治療如何治療?也就是說,是否隱含參數,有助於區分這些?使用聲明(派生類)

$ 13.3.1/4-

對於由使用-聲明引入 成一個派生類 ,該函數被認爲是 是派生類的一個成員爲 的目的nonconversion功能定義隱式對象參數的類型 。

回答

9

C++標準(C++ 03§7.3.3/ 12)說明:

using聲明帶來從基類名轉換成一個派生類範圍,成員函數在派生類中覆蓋和/或隱藏基類中具有相同名稱和參數類型的成員函數(而不是衝突)。

在您的示例中,B2::fb()隱藏了由using聲明引入的B1::fb()

至於爲什麼它是形成不良的同時具有using B1::d;int d;B2定義中,C++標準(C++ 03§7.3.3/ 10)說明:

由於使用聲明是聲明,對同一聲明區域中同一聲明的聲明限制也適用於使用聲明。

所以,它是形成不良出於同樣的原因,以下是非法的構造:它會導致相同名稱的兩個對象在一個聲明區:

struct S { int d; int d; }; 
+0

和INT d與之前使用的聲明衝突... – diverscuba23 2010-08-23 04:56:26

+0

在這種情況下,$ 13.3.1/4的真實含義是什麼? – Chubsdad 2010-08-23 05:08:05

+1

@chubsdad:由於'B2 :: fb()'隱藏了B1 :: fb()',因此在重載過程中'B1 :: fb()'不被視爲候選函數,所以§13.3.1/ 4會不適用。 – 2010-08-23 05:10:02