虚拟继承如何在c ++中解决多重继承(Diamond)?它将采用哪条路径?

时间:2016-06-07 14:15:52

标签: c++ multiple-inheritance ambiguity virtual-inheritance vptr

以下代码是钻石问题。虚拟继承解决了这种模糊性。

    #include<iostream>
    using namespace std;

    class A {
    public: void something(){cout<<"A"<<endl;} 
    };

    class B: virtual public A
    {
    public: void something() {cout<<"B"<<endl;} 
    };

    class C: virtual public A {
    public: void something() {cout<<"C"<<endl;} 
    };

    class D: public B, public C {
    public: void something() {cout<<"D"<<endl;} 
    };

    int main()
    {
        A *d = new D();
        d->something();
    }
  1. 虚拟继承如何解决这个问题?会有 vtable 条目吗?
  2. 编译器采用哪种路径来达到父类?

1 个答案:

答案 0 :(得分:1)

使用虚拟继承时,父类的成员在所有子类之间是共享,而不是为每个子类重复,因此实际上没有菱形。