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