0

下面的代码是关于钻石问题的。虚拟继承解决了这种歧义。

    #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. 编译器采用哪条路径到达父类?
4

1 回答 1

1

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

于 2016-06-07T14:18:46.130 回答