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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

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

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

多繼承(Multiple Inheritance)是指從多個直接基類中產生派生類的能力,多繼承的派生類繼承了所有父類的成員。盡管概念上非常簡單,但是多個基類的相互交織可能會帶來錯綜復雜的設計問題,命名沖突就是不可回避的一個。

多繼承時很容易產生命名沖突,即使我們很小心地將所有類中的成員變量和成員函數都命名為不同的名字,命名沖突依然有可能發生,比如典型的是菱形繼承,如下圖所示:

類 A 派生出類 B 和類 C,類 D 繼承自類 B 和類 C,這個時候類 A 中的成員變量和成員函數繼承到類 D 中變成了兩份,一份來自 A–>B–>D 這條路徑,另一份來自 A–>C–>D 這條路徑。

在一個派生類中保留間接基類的多份同名成員,雖然可以在不同的成員變量中分別存放不同的數據,但大多數情況下這是多余的:因為保留多份成員變量不僅占用較多的存儲空間,還容易產生命名沖突。假如類 A 有一個成員變量 a,那么在類 D 中直接訪問 a 就會產生歧義,編譯器不知道它究竟來自 A -->B–>D 這條路徑,還是來自 A–>C–>D 這條路徑。下面是菱形繼承的具體實現:

#include<iostream> using namespace std;//間接基類A class A{ protected:int m_a; }; //直接基類B class B: public A{ protected:int m_b; }; //直接基類C class C: 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; } //正確 public:int m_d; }; int main(){D d;cout<<d.m_d;return 0; }

這段代碼實現了上圖所示的菱形繼承,第 25 行代碼試圖直接訪問成員變量 m_a,結果發生了錯誤,因為類 B 和類 C 中都有成員變量 m_a(從 A 類繼承而來),編譯器不知道選用哪一個,所以產生了歧義。

為了消除歧義,我們可以在 m_a 的前面指明它具體來自哪個類:

void seta(int a){ B::m_a = a; }

這樣表示使用 B 類的 m_a。當然也可以使用 C 類的:

void seta(int a){ C::m_a = a; }

總結

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

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