雖然單繼承已能應對大多數場景,但當問題域需要組合多個獨立介面時,多重繼承提供了更直接的建模方式。本文系統梳理 C++ 多重繼承的核心機制。
class ZooAnimal { /*...*/ };
class Bear : public ZooAnimal { /*...*/ };
class Endangered { /*...*/ };
class Panda : public Bear, public Endangered { /*...*/ };
派生類包含所有直接基類的子對象,以及虛基類(若有)的共享子對象。基類在派生列表中只能出現一次,語言不限制基類數量。
對於 Panda:ZooAnimal → Bear → Endangered → Panda。構造函數初始化列表中基類出現順序不影響實際調用順序。
嚴格遵循構造的逆序:Panda → Endangered → Bear → ZooAnimal。
派生類指針可隱式轉換為任意基類指針。若多個基類有同名函數,直接調用會導致編譯錯誤(二義性),需顯式指定 Bear::print() 或 Endangered::print()。虛函數表機制確保通過基類指針調用時能正確分派到最終覆蓋者。
所有根基類應宣告虛析構函數。無論通過哪種基類指針 delete,都會按逆序調用完整析構鏈,避免資源洩漏。
多重繼承下,派生類作用域被多個基類作用域包圍。查找時並行搜索所有基類子樹;若在多棵子樹中找到同名聲明,則構成二義性(即使其中一個不可訪問)。解決方法:顯式限定基類名(Derived::Base::member)。