17.3 多重繼承與虛繼承
多重繼承(multiple inheritance)可以更直接地為應用程序建模。多重繼承是從多於一個直接基類派生類的能力,多重繼承的派生類繼承其所有父類的屬性。
17.3.1 多重繼承
1. 定義多個類
派生類為每個基類(顯式或隱式地)指定了訪問級別——public、protected或private。像單繼承一樣,只有在定義之後,類才可以用作多重繼承的基類。對於類可以繼承的基類的數目,沒有語言強加的限制,但在一個給定派生列表中,一個基類只能出現一次。
class ZooAnimal{};
class Endangered{};
class Bear:public ZooAnimal{};
class Panda:public Bear,public Endangered{};
class ZooAnimal{};
class Endangered{};
class Bear:public ZooAnimal{};
class Panda:public Bear,public Endangered{};2. 多重繼承的派生類從每個基類中繼承狀態
在多重繼承下,派生類的對象包含每個基類的基類子對象。
3. 派生類構造函數初始化所有基類
構造派生類型的對象包括構造和初始化它的所有基類子對象。
namespace Andersoft
{
namespace Animal
{
class ZooAnimal{};
class Endangered{};
class Bear:public ZooAnimal{};
class Panda:public Bear,public Endangered{
public:
Panda():Bear(),Endangered(){}
};
}
}
namespace Andersoft
{
namespace Animal
{
class ZooAnimal{};
class Endangered{};
class Bear:public ZooAnimal{};
class Panda:public Bear,public Endangered{
public:
Panda():Bear(),Endangered(){}
};
}
}
4. 構造的次序
構造函數初始化式只能控制用於初始化基類的值,不能控制基類的構造次序。基類構造函數按照基類構造函數在類派生列表中的出現次序調用。
構造函數調用次序不受構造函數初始化列表中出現的基類的影響,也不受基類在構造函數初始化列表中的出現次序的影響。
5. 析構的次序
總是按照構造函數運行的逆序調用析構函數。
摘自 xufei96的專欄