下面的代码是关于钻石问题的。虚拟继承解决了这种歧义。
#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条目吗?
- 编译器采用哪条路径到达父类?