2013-03-19 114 views
3

我對繼承的虛擬類有以下代碼,並以某種方式inh::P1編譯爲char。任何人都可以解釋爲什麼在這個例子中,編譯器選擇char而不是intinh::P1?謝謝!虛擬繼承成員查詢

#include <iostream> 

class myClass {public: typedef int P1;}; 
class myClassdef : virtual public myClass {}; 
class myClass2 : virtual public myClass { public: typedef char P1;}; 
class inh : public myClassdef, public myClass2 {}; 

int main() 
{ 
    std::cout << sizeof(inh::P1) << std::endl; 
    return 0; 
} 

回答

4
sizeof(inh::P1); 

查找從最直接的電平發生和向上因此inh::P1P1其通過myClass2繼承,這是確實的類型char的。如果您需要引用成員在最頂端的基類:

sizeof(myClass::P1); 

需要注意的是:

inh::P1   ---> Refers to immediate base member, i.e: myClass2::P1 
myClass2::P1  ---> Refers to member in current class scope, i.e: myClass2::P1 
myClassdef::P1 ---> Refers to immediate base member, i.e: myClass::P1 
myClass::P1  ---> Refers to member in current class scope, i.e: myClass::P1 
1

基本上在多重繼承查找是在最近的水平上進行,因爲,當你調用INH ::調用myClass2的P1,P1。 所以,如果你想引用myClass,那麼明確地調用它如下:

sizeof(myClass::P1);