C++ Primer 5th笔记(chap 18 大型程序工具)虚继承
1. 問題
派生類可以多次繼承同一個類。 派生類可以通過它的兩個直接基類分別繼承同一個間接基類, 也可以直接繼承某個基類, 然后通過另一個基類再一次間接繼承該類。如果某個類在派生過程中出現(xiàn)了多次, 則派生類中將包含該類的多個子對象。
2. 虛基類virtual inheritance
虛繼承的目的是令某個類做出聲明,承諾愿意共享它的基類。其中共享的基類子對象被稱為虛基類,不論虛基類在繼承體系下被繼承多少次,在派生類中都只包含唯一一個共享的虛基類子對象(菱形繼承)。
2.1 使用方式
指定虛基類的方式是在派生列表中添加關鍵字virtual:
//public和virtual的順序隨意 class Raccon : public virtual ZooAnimal{}; class Bear : virtual public ZooAnimal{}; class Panda : public Raccon,public Bear, public Endangered{};2.2 支持向基類的常規(guī)類型轉(zhuǎn)換
不論基類是不是虛基類, 派生類對象都能被可訪問基類的指針或引用操作
void dance(const Bear &); void rummage(const Raccoons); ostreamS operator << (ostreamS, const ZooAnimal&); Panda ying_yang; dance(ying_yang);//正確:把一個 Panda 對象當成 Bear 傳遞 rummage(ying_yang)//正確:把一個 Panda 對象當成 Raccoon 傳遞 cout << ying_yang;//正確:把一個 Panda 對象當成 ZooAnimal 傳遞2.3 虛基類成員的可見性(二義性問題)
因為在每個共享的虛基類中只有唯一一個共享的子對象, 所以該基類的成員可以被直接訪問, 并且不會產(chǎn)生二義性。
如果虛基類的成員只被一條派生路徑覆蓋, 則我們?nèi)匀豢梢灾苯釉L問這個被覆蓋的成員。 但是如果成員被多余一個基類覆蓋, 則一般情況下派生類必須為該成員自定義一個新的版本
與非虛的多重繼承體系一樣, 解決二義性最好的方法是在派生類中為成員自定義新的實例。
eg. 假定類 B 定義了一個名為 x 的成員, D1 和 D2 都是從 B 虛繼承得到的, D 繼承了 D1 和 D2, 則在 D 的作用域中, x 通過 D 的兩個基類都是可見的。 如果我們通過 D的對象使用 X, 有三種可能性:
- 如 果 在 D1 和 D2 中都沒有 x 的定義, 則 x 將被解析為 B 的成員, 此時不存在二義性, 一個 D 的對象只含有 x 的一個實例。
- 如果 x 是 B 的成員, 同時是 D1 和 D2 中某一個的成員, 則同樣沒有二義性, 派生類的 x 比共享虛基類 B 的 x 優(yōu)先級更高。
- 如 果 在 D1 和 D2 中都有 x 的定義, 則直接訪問 x 將產(chǎn)生二義性問題。
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)虚继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha