1:以前講到從cbird類和cfish類派生子類cwaterbird時,在cwaterbird類中將存在兩個canimal類的複製。那麼如何在派生cwaterbird類時使其只存在乙個canimal基類呢?c++語言提供的虛繼承機制能夠解決這個問題。
**如下:
// 8.8.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include using namespace std;
class canimal //定義乙個動物類
void move() //定義成員函式
};class cbird : virtual public canimal //從canimal類虛繼承cbird類
void flyinsky() //定義成員函式
void breath() //定義成員函式
};class cfish: virtual public canimal //從canimal類虛繼承cfish
void swiminwater() //定義成員函式
void breath() //定義成員函式
};class cwaterbird: public cbird, public cfish //從cbird和cfish類派生子類cwaterbird
void action() //定義成員函式
};int main(int argc, char* ar**) //主函式
view code
執行結果:
上述**中,在定義cbird類和cfish類時使用了關鍵字virtual,cfish類從基類canimal派生而來。實際上,虛繼承對cbird類和cfish類沒有多少影響,卻對cwaterbird類產生了很大的影響。cwaterbird類中不再有兩個canimal類的複製,而只存在乙個canimal的複製。
通常,在定義乙個物件時,先依次呼叫基類的建構函式,最後才呼叫自身的建構函式。但是對於虛繼承來說情況有些不同。在定義cwaterbird類的物件時,先呼叫基類canimal的建構函式,然後呼叫cbird類的建構函式,這裡cbird類雖然為canimal的子類,但是在呼叫cbird類的建構函式時將不再呼叫canimal類的建構函式。對於cfish也是同樣的道理。
收藏
C 入門經典 例8 1 類的繼承
1 繼承是物件導向的主要特徵 此外還有封裝和多型 之一,它使得乙個類可以從現有類中派生,而不必重新定義乙個新類。繼承的實質就是用已有的資料型別建立新的資料型別,並保留已有資料型別的特點,以舊類為基礎建立新類,新類包含了舊類的資料成員和成員函式,並且可以在新類中新增新的資料成員和成員函式。舊類被稱為基...
C 入門經典 例8 6 多重繼承的構造順序
1 單一繼承是先呼叫基類的建構函式,然後呼叫派生類的建構函式,但多重繼承將如何呼叫建構函式呢?多重繼承中的基類建構函式被呼叫的順序以派生表中宣告的順序為準。派生表就是多重繼承定義中繼承方式後面的內容,呼叫順序就是按照基類名識別符號的前後順序進行的。2 如下 8.6.cpp 定義控制台應用程式的入口點...
C 快速入門 虛繼承(21)
c 快速入門 虛繼承 21 通過虛繼承某個基類,就是在告訴編譯器,從當前這個類再派生出來的子類只能擁有那個基類的乙個例項。虛繼承的語法 class teacher virtual public person 讓student類和teacher類都虛繼承自person類,編譯器將確保從student和...