在本文中,您將學習C ++編程中的不同繼承模型:帶有示例的多繼承,多層和分層繼承。
繼承是面向對象編程語言的核心功能之一。它允許軟件開發(fā)人員從現(xiàn)有的類派生一個新的類。派生類繼承基類(現(xiàn)有類)的功能。
C ++編程中有多種繼承模型。
在C ++編程中,不僅可以從基類派生一個類,還可以從派生類派生一個類。這種繼承形式稱為多層繼承。
class A { ... .. ... }; class B: public A { ... .. ... }; class C: public B { ... ... ... };
這里,類B派生自基類A,類C派生自派生類B。
#include <iostream> using namespace std; class A { public: void display() { cout<<"基類的內容。"; } }; class B : public A { }; class C : public B { }; int main() { C obj; obj.display(); return 0; }
輸出結果
基類的內容。
在這個程序中,C類是從B類派生出來的(B類是從基類A派生出來的)。
C類的obj對象在main()函數(shù)中定義。
調用display()函數(shù)時,將執(zhí)行類A中的display()。 這是因為在C類和B類中沒有display()函數(shù)。
編譯器首先在類C中查找display()函數(shù)。由于該函數(shù)在該類中不存在,因此它將在類B中查找該函數(shù)(因為C是從B派生的)。
這個display()函數(shù)在B類中也不存在,所以編譯器在A類中尋找它(因為B是從A派生出來的)。
如果C中存在display()函數(shù),則編譯器將覆蓋類A的display()(因為成員函數(shù)覆蓋)。
在C ++編程中,一個類可以從多個父類派生。 例如:Bat類是從Mammal和WingedAnimal基類派生的。 這很有意義,因為蝙蝠既是哺乳動物(Mammal)又是有翅膀的動物(WingedAnimal)。
#include <iostream> using namespace std; class Mammal { public: Mammal() { cout << "哺乳動物可以直接出生。" << endl; } }; class WingedAnimal { public: WingedAnimal() { cout << "有翼的動物能拍動翅膀。" << endl; } }; class Bat: public Mammal, public WingedAnimal { }; int main() { Bat b1; return 0; }
輸出結果
哺乳動物可以直接出生。 有翼的動物能拍動翅膀。
多重繼承最明顯的問題發(fā)生在函數(shù)重寫期間。
假設兩個基類具有相同的函數(shù),但在派生類中未重寫該函數(shù)。
如果嘗試使用派生類的對象調用該函數(shù),則編譯器將顯示錯誤。這是因為編譯器不知道要調用哪個函數(shù)。例如,
class base1 { public: void someFunction( ) { .... ... .... } }; class base2 { void someFunction( ) { .... ... .... } }; class derived : public base1, public base2 { }; int main() { derived obj; obj.someFunction() // 錯誤! }
這個問題可以通過使用范圍解析函數(shù)來指定哪個函數(shù)屬于base1或base2類來解決
int main() { obj.base1::someFunction( ); // 調用base1類的函數(shù) obj.base2::someFunction(); // 調用base2類的函數(shù) }
如果從基類繼承多個類,則稱為分層繼承。在分層繼承中,子類中共有的所有功能都包括在基類中。
例如:物理,化學,生物學均來自科學課。
class base_class { ... .. ... } class first_derived_class: public base_class { ... .. ... } class second_derived_class: public base_class { ... .. ... } class third_derived_class: public base_class { ... .. ... }