C 虛擬繼承

2021-04-13 00:04:45 字數 1121 閱讀 7627

就是為了解決面相物件中繼承結構中可怕的菱形結構 。下面是別人的,看看就懂了。

從意義上來看,乙個sleepersofa沒有沙發和床兩種重量, 如此的繼承不是真實的現實世界描述。進一步分析可得,床和沙發都是家具的一種,凡家具都有重量,所以通過分解來考察其關係,如圖17—2所示。

圖17-2 床和沙發的分解

//**********************

//**   ch17_2.cpp  **

//**********************

#include

class furniture

void setweight(int i)

int getweight()

protected:

int weight;

};class bed :public furniture

void sleep()

};class sofa :public furniture

void watchtv()

};class sleepersofa :public bed, public sofa

void foldout()

};void main()

void setweight(int i)

int getweight()

protected:

int weight;

};class bed :virtual public furniture

void sleep()

};class sofa :virtual public furniture

void watchtv()

};class sleepersofa :public bed, public sofa

void foldout()

};void main()

{sleepersofa ss;

ss.setweight(20);

cout <

圖17-5 虛擬繼承的sleepeisofa記憶體布局

在虛擬繼承的情況下,應用程式main()中引用getweight()不再模糊,我們得到了真正的圖17-2所示的繼承關係。

->虛擬繼承的虛擬和虛函式的虛擬沒有任何關係。

C 虛擬繼承

就是為了解決面相物件中繼承結構中可怕的菱形結構 下面是別人的,看看就懂了。從意義上來看,乙個sleepersofa沒有沙發和床兩種重量,如此的繼承不是真實的現實世界描述。進一步分析可得,床和沙發都是家具的一種,凡家具都有重量,所以通過分解來考察其關係,如圖17 2所示。圖17 2 床和沙發的分解 c...

虛擬繼承C

c 中虛擬繼承的概念 為了解決從不同途徑繼承來的同名的資料成員在記憶體中有不同的拷貝造成資料不一致問題,將共同基類設定為虛基類。這時從不同的路徑繼承過來的同名資料成員在記憶體中就只有乙個拷貝,同乙個函式名也只有乙個對映。這樣不僅就解決了二義性問題,也節省了記憶體,避免了資料不一致的問題。class ...

C 虛擬繼承

4.3 隱藏 是指派生類的函式遮蔽了與其同名的基類函式,特徵是 1 如果派生類的函式與基類的函式同名,但是引數不同,此時,不論有無virtual關鍵字,基類的函式將被隱藏 注意別與過載混淆 2 如果派生類的函式與基類的函式同名,但是引數相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被...