在學習C++的時候,菱形繼承問題絕對是一個不可避免的重點問題,那麼什麼是菱形繼承問題呢?下圖就是,長得像不像鑽石?我畫圖確實很難看
因為C++允許多繼承,當繼承關系像上圖這樣子的時候,就會出現這樣子的情況
A類是基類,B裡面有個A我表示為B(A),C裡面有個A我表示為C(A)
那麼D裡面有B和C我表示為D(B(A)C(A))
當我們想去使用D裡面的A的時候,或者說訪問A的部分值,在說白了究竟哪個A才是屬於D的,D中的A究竟是B的A還是C的A?
1 class A 2 {}; 3 class B :public A 4 {}; 5 class C :public A 6 {}; 7 class D :public B, public C 8 {};
這麼寫可就錯了,有的編譯器甚至都不讓你通過,直接給你報錯
這很令人尴尬不是麼,就算編譯期讓你通過了,也不要試圖這樣去通過D的對象訪問其內部的A對象,這會讓編譯器很糾結
但是很簡單給個vitual就好了
1 class A 2 {}; 3 class B :virtual public A 4 {}; 5 class C :virtual public A 6 {}; 7 class D : public B, public C 8 {};
他有了一個屬於自己的A,調用A中的變量或者函數的時候就會去屬於自己的A中調用,就不會讓編譯期糾結了