首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 虛繼承構造/析構順序:虛基類優先、按聲明序、反序析構

     編輯:C++ 入門

繼承結構範例

class ZooAnimal { ... };           // 虛基類
class Bear : virtual public ZooAnimal { ... };
class Character { ... };
class BookCharacter : public Character { ... };
class ToyAnimal { ... };           // 虛基類
class TeddyBear : public BookCharacter, public Bear, virtual public ToyAnimal { ... };

構造順序規則

  1. 虛基類:按在繼承鏈中首次出現的順序 (深度優先左到右) 構造,每個虛基類只構造一次。
  2. 非虛基類:按繼承聲明順序構造。
  3. 派生類自身:最後構造。

本例構造序列

ZooAnimal (虛基類,由 Bear 首次引入)
ToyAnimal (虛基類,由 TeddyBear 直接虛繼承)
Character (非虛基類,BookCharacter 的基類)
BookCharacter (非虛基類,TeddyBear 第一個基類)
Bear (非虛基類,TeddyBear 第二個基類)
TeddyBear (最派生類)

析構順序

完全相反:最派生類 → 非虛基類 (逆聲明序) → 虛基類 (逆首次出現序)。

代碼驗證

class ZooAnimal { public: ZooAnimal() { cout << "ZooAnimal Constructor\n"; } };
class Bear : virtual public ZooAnimal { public: Bear() { cout << "Bear Constructor\n"; } };
class Character { public: Character() { cout << "Character Constructor\n"; } };
class BookCharacter : public Character { public: BookCharacter() { cout << "BookCharacter Constructor\n"; } };
class ToyAnimal { public: ToyAnimal() { cout << "ToyAnimal Constructor\n"; } };
class TeddyBear : public BookCharacter, public Bear, virtual public ToyAnimal {
public: TeddyBear() { cout << "TeddyBear Constructor\n"; } };
int main() { TeddyBear tb; }

輸出

ZooAnimal Constructor
ToyAnimal Constructor
Character Constructor
BookCharacter Constructor
Bear Constructor
TeddyBear Constructor

關鍵點

  • 虛基類由最派生類負責構造 (直接或間接),中間派生類不再構造虛基類。
  • 非虛基類每次繼承都構造一次 (多重繼承可能導致多份副本)。
  • 虛繼承解決「菱形繼承」重複基類問題,但引入指針/偏移開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved