91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

虛基類

發布時間:2020-03-21 14:46:17 來源:網絡 閱讀:340 作者:淺唱逝流年 欄目:編程語言

class B

{

public:

                 int b;

};


class C1 :virtual public B

{

public:

                 int c1;

};

class C2 :virtual public B

{

public:

                 int c2;

};

class D :public C1, public C2

{

public:

                  int d;

};

int main()

{

                cout << sizeof(D ) << endl;     //24


                 B b;

                 D d;

     


                system( "pause");

                 return 0;

}


在類D中添加函數,改為:

class D :public C1, public C2

{

public:

                 void Display()

                {

                                c1 = 0x02;

                                 C2::b = 0x03;

                                c2 = 0x04;

                                d = 0x05;

                  cout << "this=" << this << endl << endl;

                  cout << "&C1::b=" << &(C1 ::b) << endl;

                  cout << "&c1=" << &c1 << endl;

                  cout << "&C2::b=" << &(C2 ::b) << endl;

                  cout << "&c2=" << &c2 << endl;

                   cout << "&d=" << &d << endl;


                  cout << b << endl;

                }

                 int d;

};

主函數寫為:

int main()

{

                cout << sizeof(D ) << endl;  //24


                 B b;

                 D d;

                d.Display();


                 C1 c;

                system( "pause");

                 return 0;

}

調試截圖為:

虛基類

虛基類

原理分析:

因為類B是類C1和類C2的基類,所以C1和C2都會繼承B的數據成員b,所以C1和C2中會存在同名成員,當類D繼承類C1和類C2的時候,就會有兩個數據成員b,這樣會保留多份數據成員的拷貝,不僅占用較多的存儲空間,還增加了訪問這些成員的困難,實際上,我們也不需要有多份拷貝。

為了解決這一問題,我們讓類C1和類C2在繼承B的時候進行了虛繼承,即在繼承方式前加virtual ,虛基類使得在繼承間接共同基類時只保留一份成員。

數據結果分析:

在代碼中,我們只給類C1中繼承的b賦值為3,但是截圖顯示,類C1和類C2中的數據成員b的值都為3,而且類C1和類C2 中數據成員Bde地址是一樣的,這就驗證了“虛基類使得在繼承間接共同基類時只保留一份成員

虛基類并不是在聲明基類時聲明的,而是在聲明派生類時,指定繼承方式時聲明的。

聲明虛基類的一般方式為:

class 派生類名:virtual 繼承方式 基類名

在最后的派生類中,不僅要負責對其直接基類進行初始化,還要負責對虛基類初始化


對于這個例子

有虛基類的時候:

虛基類

沒有虛基類的時候:

虛基類

沒有虛基類的時候,對于這種菱形繼承,派生類D中會有兩個數據成員int b,也是因此,在訪問的時候必須要寫清楚訪問的是那個類里面的b成員,如C1::b,否則會因為訪問成員不明確而造成錯誤,為了避免這一問題,要在聲明繼承方式的時候加上virtual關鍵字,表示這是一個虛繼承


通過看內存,可以清楚的看到在類D中,最后繼承下來的數據成員是如何放置的

虛基類

虛基類

c1中的虛基類地址存儲的偏移量20

虛基類

c2中的虛基類地址存儲的偏移量12

虛基類

在內存中大概就是這個樣子:

虛基類


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

连云港市| 罗田县| 江源县| 门头沟区| 滕州市| 文登市| 旅游| 韶山市| 东城区| 江安县| 临安市| 万州区| 通化市| 潮州市| 临城县| 吉水县| 大方县| 陵水| 津南区| 大宁县| 泉州市| 黄山市| 会同县| 广水市| 克山县| 来安县| 汉沽区| 芒康县| 上林县| 松原市| 萨嘎县| 日照市| 吉木乃县| 西充县| 石楼县| 桑日县| 宁国市| 疏勒县| 敖汉旗| 荆州市| 庄浪县|