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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++虚继承和虚基类详解(二)

發布時間:2025/4/5 c/c++ 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++虚继承和虚基类详解(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

虛繼承(Virtual Inheritance)
為了解決多繼承時的命名沖突和冗余數據問題,C++ 提出了虛繼承,使得在派生類中只保留一份間接基類的成員。

在繼承方式前面加上 virtual 關鍵字就是虛繼承,請看下面的例子:

//間接基類A class A{ protected:int m_a; }; //直接基類B class B: virtual public A{ //虛繼承 protected:int m_b; }; //直接基類C class C: virtual public A{ //虛繼承 protected:int m_c; }; //派生類D class D: public B, public C{ public:void seta(int a){ m_a = a; } //正確void setb(int b){ m_b = b; } //正確void setc(int c){ m_c = c; } //正確void setd(int d){ m_d = d; } //正確 private:int m_d; }; int main(){D d;return 0; }

這段代碼使用虛繼承重新實現了上圖所示的菱形繼承,這樣在派生類 D 中就只保留了一份成員變量 m_a,直接訪問就不會再有歧義了。
虛繼承的目的是讓某個類做出聲明,承諾愿意共享它的基類。其中,這個被共享的基類就稱為虛基類(Virtual Base Class),本例中的 A 就是一個虛基類。在這種機制下,不論虛基類在繼承體系中出現了多少次,在派生類中都只包含一份虛基類的成員。
現在讓我們重新梳理一下本例的繼承關系,如下圖所示:


觀察這個新的繼承體系,我們會發現虛繼承的一個不太直觀的特征:必須在虛派生的真實需求出現前就已經完成虛派生的操作。在上圖中,當定義 D 類時才出現了對虛派生的需求,但是如果 B 類和 C 類不是從 A 類虛派生得到的,那么 D 類還是會保留 A 類的兩份成員。

換個角度講,虛派生只影響從指定了虛基類的派生類中進一步派生出來的類,它不會影響派生類本身。

在實際開發中,位于中間層次的基類將其繼承聲明為虛繼承一般不會帶來什么問題。通常情況下,使用虛繼承的類層次是由一個人或者一個項目組一次性設計完成的。對于一個獨立開發的類來說,很少需要基類中的某一個類是虛基類,況且新類的開發者也無法改變已經存在的類體系。

C++標準庫中的 iostream 類就是一個虛繼承的實際應用案例。iostream 從 istream 和 ostream 直接繼承而來,而 istream 和 ostream 又都繼承自一個共同的名為 base_ios 的類,是典型的菱形繼承。此時 istream 和 ostream 必須采用虛繼承,否則將導致 iostream 類中保留兩份 base_ios 類的成員。


虛基類成員的可見性
因為在虛繼承的最終派生類中只保留了一份虛基類的成員,所以該成員可以被直接訪問,不會產生二義性。此外,如果虛基類的成員只被一條派生路徑覆蓋,那么仍然可以直接訪問這個被覆蓋的成員。但是如果該成員被兩條或多條路徑覆蓋了,那就不能直接訪問了,此時必須指明該成員屬于哪個類。

以圖2中的菱形繼承為例,假設 A 定義了一個名為 x 的成員變量,當我們在 D 中直接訪問 x 時,會有三種可能性:
如果 B 和 C 中都沒有 x 的定義,那么 x 將被解析為 A 的成員,此時不存在二義性。
如果 B 或 C 其中的一個類定義了 x,也不會有二義性,派生類的 x 比虛基類的 x 優先級更高。
如果 B 和 C 中都定義了 x,那么直接訪問 x 將產生二義性問題。

可以看到,使用多繼承經常會出現二義性問題,必須十分小心。上面的例子是簡單的,如果繼承的層次再多一些,關系更復雜一些,程序員就很容易陷人迷魂陣,程序的編寫、調試和維護工作都會變得更加困難,因此我不提倡在程序中使用多繼承,只有在比較簡單和不易出現二義性的情況或實在必要時才使用多繼承,能用單一繼承解決的問題就不要使用多繼承。也正是由于這個原因,C++ 之后的很多面向對象的編程語言,例如 Java、C#、PHP 等,都不支持多繼承。

總結

以上是生活随笔為你收集整理的C++虚继承和虚基类详解(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 一级v片 | 日韩黄色在线视频 | 亚洲男人天堂影院 | 黑人三级视频 | 一本久道久久综合 | 久草免费在线视频 | 超碰毛片 | 小黄网站在线观看 | 国产孕交| 欧美精品网 | 日韩av第一页 | 狠狠操在线 | 亚洲一区日韩精品 | 韩国日本欧美一区 | 色老板最新地址 | 三级小视频在线观看 | 国产精品欧美激情在线播放 | 国产a∨精品一区二区三区仙踪林 | www.自拍偷拍 | 精品黑人一区二区三区国语馆 | 日本黄色大片在线观看 | 精品国产欧美日韩 | 激情久久网站 | a级一级片| 91制服诱惑| 日韩成人在线网站 | 91亚洲国产成人久久精品麻豆 | 狠狠a| 成人精品一区日本无码网 | 岛国av不卡 | 91在线精品一区二区三区 | 日本中文字幕免费观看 | 天天色一色 | 午夜激情视频在线观看 | 少妇性高潮视频 | 久久伊人网站 | 国产成人精品免费 | 日韩免费久久 | 日韩和欧美的一区二区 | www.男人的天堂 | 黄色网占 | 国产98色在线 | 日韩 | 亚洲综合热 | 亚洲精品aⅴ | 国产成人午夜精品 | 超污视频网站 | 欧美日韩在线观看一区二区三区 | 亚洲精品一区二区三区不卡 | 免费国产高清 | 日韩成人在线视频 | 欧美性生活一区二区 | 动漫美女被x | 秋霞成人午夜伦在线观看 | 国产精品丝袜黑色高跟鞋的设计特点 | 67194成人在线观看 | 久久久久1 | 最近中文字幕无免费 | 久久午夜场 | 女女爱爱视频 | 日本一区二区网站 | 天堂中文在线播放 | 欧美大片在线看免费观看 | 暖暖日本在线 | 亚洲网站免费看 | 污污av| 久久激情av | 级毛片 | 亚洲一二三av | 先锋影音制服丝袜 | 成人精品在线观看视频 | 中文字幕精品一区二区精 | 黄色大片在线看 | 男人天堂久久 | 91精品国产高清91久久久久久 | 国产情侣av自拍 | 国产盗摄一区二区三区在线 | 亚洲六月丁香色婷婷综合久久 | jizz中国少妇高潮出水 | 天堂8av | 日本精品免费视频 | 国产精品免费av一区二区三区 | 国产综合av | 欧洲久久久久久 | 午夜草逼 | 99久久久无码国产精品免费麻豆 | 亚洲精品在线播放视频 | 91免费网站 | 日日色av | 国产欧美精品一区二区三区app | 色香av| 中国少妇乱子伦视频播放 | 伊人久久大香线蕉综合网站 | 美女免费视频网站 | 日韩欧美一区二区在线观看 | 欧美伦理一区二区三区 | 久草加勒比 | 91九色国产ts另类人妖 | 老女人综合网 | 福利视频导航网 |