虚拟继承成员查找

时间:2013-03-19 05:35:30

标签: c++ inheritance virtual

我有以下代码用于继承的虚拟类,不知怎的inh::P1编译为char。任何人都可以解释为什么编译器在此示例中为char选择int而不是inh::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;
}

2 个答案:

答案 0 :(得分:4)

sizeof(inh::P1);

查找从最直接的级别向上发生,因此inh::P1指的是P1,它是通过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 :(得分:1)

基本上在多重继承中,查找是在最近的级别上完成的,因此当你调用inh :: P1时,会调用myClass2的P1。 因此,如果您想引用myClass,请按以下方式明确调用它:

sizeof(myClass::P1);