【问题标题】:virtual inheritance member lookup虚拟继承成员查找
【发布时间】:2013-03-19 05:35:30
【问题描述】:

我有以下继承虚拟类的代码,不知何故inh::P1 被编译为char。谁能解释一下为什么编译器在这个例子中为inh::P1 选择char 而不是int?谢谢!

#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;
}

【问题讨论】:

    标签: c++ inheritance virtual


    【解决方案1】:
    sizeof(inh::P1);
    

    查找发生在最直接的级别和向上,因此inh::P1 指的是通过myClass2 继承的P1,它确实属于类型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
    

    【讨论】:

      【解决方案2】:

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

      sizeof(myClass::P1);
      

      【讨论】:

        猜你喜欢
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2015-12-24
        • 2016-10-26
        • 2013-08-24
        相关资源
        最近更新 更多