C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承
1. 繼承體系中的每個類都可能在某個時刻成為“ 最低層的派生類”。 只要我們能創建虛基類的派生類對象, 該派生類的構造函數就必須初始化它的虛基類。
Bear::Bear (std::string name, bool onExhibit):ZooAnimal (name, onExhibit, "Bear”) { } Raccoon::Raccoon (std::string name, bool onExhibit )ZooAnimal (name, onExhibit, "Raccoon”) { }1.1 虛繼承的對象的構造方式
含有虛基類的對象的構造順序與一般的順序稍有區別:
step1.使用提供給最低層派生類構造函數的初始值初始化該對象的虛基類子部分
step2.按照直接基類在派生列表中出現的次序依次對其進行初始化
eg. 當創建一個 Panda 對象時, Panda 位于派生的最低層并由它負責初始化共享的ZooAnimal 基類部分。 即使 ZooAnimal 不是 Panda 的直接基類, Panda 的構造函數也可以初始化 ZooAnimal:
step1. 使用 Panda 的構造函數初始值列表中提供的初始值構造虛基類 ZooAnimal
部分。
step2. 構造 Bear 部分。
step3.構造Raccoon 部分。
step4.構造第三個直接基類 Endangered。
step5.構造 Panda 部分
1.2 構造函數與析構函數的次序
一個類可以有多個虛基類。 此時, 這些虛的子對象按照它們在派生列表中出現的順序從左向右依次構造。
class Character { /* ... */ ;} class BookCharacter : public Character { /* …*/ }; class ToyAnimal { /* ... */}; class TeddyBear : public BookCharacter, public Bear, public virtual ToyAnimal{ /* ... */ ;}編譯器按照直接基類的聲明順序對其依次進行檢査, 以確定其中是否含有虛基類。 如果有, 則先構造虛基類, 然后按照聲明的順序逐一構造其他非虛基類。 因此, 要想創建一個 TeddyBear 對象, 需要按照如下次序調用這些構造函數:
ZooAnimal ( );/ / Bear 的虛基類 ToyAnimal ( );/ / 直接虛基類 Character ( );/ / 第一個非虛基類的間接基類 BookCharacter ( )/ / 第一個直接非虛基類 Bear ( );/ / 第二個直接非虛基類 TeddyBear ( ) ;/ / 最低層的派生類1.3 合成的拷貝和移動構造函數按照完全相同的順序執行, 合成的賦值運算符中的成員也按照該順序賦值。
1.4 對象的銷毀順序與構造順序正好相反, 首先銷毀TeddyBear 部分, 最后銷毀 ZooAnimal 部分
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: std::get(std::tuple)