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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++虚基类

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

在多繼承時很容易產生命名沖突問題,如果我們很小心地將所有類中的成員變量及成員函數都命名為不同的名字時,命名沖突依然有可能發生,比如非常經典的菱形繼承層次。類A派生出類B和類C,類D繼承自類B和類C,這個時候類A中的成員變量和成員函數繼承到類D中變成了兩份,一份來自A派生B然后派生D這一路,另一份來自A派生C然后派生D這一條路。

?

class A { public:void setx(int a){x = a;}int getx(){return x;} private:int x; };class B: public A { public:void sety(int a){y = a;}int gety(){return y;} private:int y; };class C: public A { public:void setz(int a){z = a;}int getz(){return z;} private:int z; };class D: public B, public C {//...... };

本例即為典型的菱形繼承結構,類A中的成員變量及成員函數繼承到類D中均會產生兩份,這樣的命名沖突非常的棘手,通過域解析操作符已經無法分清具體的變量了。為此,C++提供了虛繼承這一方式解決命名沖突問題。虛繼承只需要在繼承屬性前加上virtual關鍵字。

#include <iostream> using namespace std;class A { public:void setx(int a){x = a;}int getx(){return x;} private:int x; };class B: virtual public A { public:void sety(int a){y = a;}int gety(){return y;} private:int y; };class C: virtual public A { public:void setz(int a){z = a;}int getz(){return z;} private:int z; };class D: public B, public C {//...... };int main() {D test;test.setx(10);cout<<test.getx()<<endl;return 0; }

在本例中,類B和類C都是繼承類A都是虛繼承,如此操作之后,類D只會得到一份來自類A的數據。在本例的主函數中,定義了類D的對象test,然后通過該對象調用從類A間接繼承來的setx和getx成員函數,因為B和C繼承自類A采用的是虛繼承,故通過D調用setx和getx不會有命名沖突問題,因為D類只得到了一份A的數據。

總結

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

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