【问题标题】:How virtual inheritance solves Multiple inheritance(Diamond) in c++?Which path will it take?虚拟继承如何解决c++中的多重继承(Diamond)?会走哪条路?
【发布时间】:2016-10-07 12:04:13
【问题描述】:

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

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

【问题讨论】:

  • 您可能想阅读这个不错的资源:@​​987654321@
  • 虚继承与虚函数和vtable无关。
  • @SergeyA - 这是错误的。在 C++ 中,虚拟继承是通过改变 vtable 的语义来实现的
  • vtable 是一个实现细节,标准没有指定实现,所以你是对的它没有提到它。但是您说“虚拟继承与虚拟函数和vtable无关”-这是我不同意的。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多