class A { public: void eat(){ cout<<"A";} };
class B: virtual public A { public: void eat(){ cout<<"B";} };
class C: virtual public A { public: void eat(){ cout<<"C";} };
class D: public B,C { public: void eat(){ cout<<"D";} };
int main(){
A *a = new D();
a->eat();
}
我了解钻石问题,上面的一段代码没有这个问题。虚拟继承如何解决“菱形”(多重继承)歧义?
虚拟继承究竟如何解决问题?
我明白了什么: 当我说A *a = new D();
,编译想知道D
类型的对象可以被分配到A
类型的指针,但它有它可以遵循两条路径,但不能决定通过它自己。
那么,虚拟继承如何解决问题(帮助编译器做出决定)?
V表指针是一个实现细节。在这种情况下,并非所有编译器都会引入vtable指针。 – curiousguy 2016-06-23 01:56:14
我认为如果图形是垂直镜像的,它会更好看。在大多数情况下,我已经找到了这样的继承图来显示基础下的派生类。 (参见“downcast”,“upcast”) – peterh 2016-07-08 20:27:13