虚拟继承如何解决 c++ 中的多重继承(钻石)?它将走哪条路

How virtual inheritance solves Multiple inheritance(Diamond) in c++?Which path will it take?

本文关键字:条路 钻石 多重继承 何解决 继承 解决 虚拟 c++      更新时间:2023-10-16

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

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

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