日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ Primer 5th笔记(chap 18 大型程序工具)虚继承

發布時間:2025/3/21 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ Primer 5th笔记(chap 18 大型程序工具)虚继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 問題

派生類可以多次繼承同一個類。 派生類可以通過它的兩個直接基類分別繼承同一個間接基類, 也可以直接繼承某個基類, 然后通過另一個基類再一次間接繼承該類。如果某個類在派生過程中出現了多次, 則派生類中將包含該類的多個子對象。

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 支持向基類的常規類型轉換

不論基類是不是虛基類, 派生類對象都能被可訪問基類的指針或引用操作

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 虛基類成員的可見性(二義性問題)

因為在每個共享的虛基類中只有唯一一個共享的子對象, 所以該基類的成員可以被直接訪問, 并且不會產生二義性。

如果虛基類的成員只被一條派生路徑覆蓋, 則我們仍然可以直接訪問這個被覆蓋的成員。 但是如果成員被多余一個基類覆蓋, 則一般情況下派生類必須為該成員自定義一個新的版本

與非虛的多重繼承體系一樣, 解決二義性最好的方法是在派生類中為成員自定義新的實例。

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 優先級更高。
  • 如 果 在 D1 和 D2 中都有 x 的定義, 則直接訪問 x 將產生二義性問題。

總結

以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)虚继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。