【发布时间】: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();
}
- 虚拟继承如何解决这个问题??它会有 vtable 条目吗?
- 编译器采用哪个路径到达父类??
【问题讨论】:
-
您可能想阅读这个不错的资源:@987654321@
-
虚继承与虚函数和vtable无关。
-
@SergeyA - 这是错误的。在 C++ 中,虚拟继承是通过改变 vtable 的语义来实现的
-
vtable 是一个实现细节,标准没有指定实现,所以你是对的它没有提到它。但是您说“虚拟继承与虚拟函数和vtable无关”-这是我不同意的。
标签: c++ multiple-inheritance ambiguity virtual-inheritance vptr