1. 程式人生 > >菱形虛擬繼承

菱形虛擬繼承

先定義兩個概念
單繼承:一個子類只有一個直接父類時候稱之為單繼承
多繼承:一個子類有兩個或者兩個以上的父類時候稱之為多繼承
顯然易見,菱形繼承顧名思義當然是在繼承上有一個菱形的傳遞關係。
在這裡插入圖片描述

  • 菱形繼承的問題:從上面物件中可以發現他的問題,資料沉(去點三點水旁)餘和二義性問題。我們的菱形最頂下成員繼承的元素可以來子drival1,也可以來子drival2.
    在這裡插入圖片描述
    我們無法確認訪問name是來自drival1還是drival2
    如果是定義訪問函式區間雖然可以解決二義性但是沉餘問題還是解決不了的。怎麼辦了?
    我們需要一個虛擬函式virtual,本質上我感覺是引入了一個指標函式確定那種指向關係。
class A{ 
public:   
	int _a;
};
 class B :virtual public A 
 {
 public:
	 int _b;
 };
 class C : virtual public A
 
 { 
 public:
	 int _c;
 };

 class D : public B, public C 
 {
 public:
	 int _d;
 };

 int main() {
	 D d;  
	 d.B::_a = 1;   
	 d.C::_a = 2;
	 d._b = 3; 
	 d._c = 4;  
	 d._d = 5;

	 return 0;
 }

好了,就這樣吧,我知道我們寫的估計比較簡單沒有寫虛表,但是我們感覺c++中很多關鍵字都是可以類比指標的,感覺是指標的一層封裝不知道,這樣想對不對,但是類比過程,思維過程推理倒是沒有什麼問題。