在本文中,您將學習C ++編程中的不同繼承模型:帶有示例的多繼承,多層和分層繼承。
繼承是面向?qū)ο缶幊陶Z言的核心功能之一。它允許軟件開發(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<<"基類的內(nèi)容。";
}
};
class B : public A
{
};
class C : public B
{
};
int main()
{
C obj;
obj.display();
return 0;
}輸出結果
基類的內(nèi)容。
在這個程序中,C類是從B類派生出來的(B類是從基類A派生出來的)。
C類的obj對象在main()函數(shù)中定義。
調(diào)用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ù)。
如果嘗試使用派生類的對象調(diào)用該函數(shù),則編譯器將顯示錯誤。這是因為編譯器不知道要調(diào)用哪個函數(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( ); // 調(diào)用base1類的函數(shù)
obj.base2::someFunction(); // 調(diào)用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 {
... .. ...
}