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