2013-03-19 110 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);