色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++多繼承的二義性問題

NJ90_gh_bee81f8 ? 來源:未知 ? 作者:李建兵 ? 2018-03-14 15:26 ? 次閱讀

在多重繼承中,需要解決的主要問題是標識符不唯一,即二義性問題。比如,當在派生類繼承的多個基類中有同名成員時,派生類中就會出現標識符不唯一的情況。

在多重繼承中,派生類由多個基類派生時,基類之間用逗號隔開,且每個基類前都必須指明繼承方式,否則默認是私有繼承。可以通過以下3種方法解決二義性問題。

使用運算符"::";

使用同名覆蓋的原則;

使用虛基類;

1.使用域運算符

如果派生類的基類之間沒有繼承關系,同時又沒有共同的基類,則在引用同名成員時,可以在成員名前面加上類名和域運算符來區別來自不同基類的成員。

2.使用同名覆蓋的原則

在派生類中重新定義與基類中同名的成員(如果是成員函數,則參數表也要相同,否則是重載)以屏蔽掉基類中的同名成員,在引用這些同名成員時,引用的就是派生類中的成員。

#include

using namespace std;

class Base

{

public:

int x;

void show()

{

cout << "Base,x= " << x << endl;

}

};

class Derived :public Base

{

public:

int x;

void show()

{

cout << "Derived , x= " << x << endl;

}

};

int main()

{

Derived ob;

ob.x = 5;

ob.show();

ob.Base::show();

ob.Base::x = 12;

ob.Base::show();

system("pause");

return 0;

}

3.虛基類

在多重繼承中,要引用派生類的成員時,先是在派生類自身的作用域內尋找,如果找不到再到基類中尋找。這時,如果這些基類有一個共同的基類,派生類訪問這個共同基類的成員時,就有可能由于同名成員的問題而發生二義性,此時就需要虛基類來解決。

#include

using namespace std;

class Base

{

public:

Base()

{

x = 1;

}

protected:

int x;

};

class Base1 :public Base

{

public:

Base1()

{

cout << "Base1,x= " << x << endl;

}

};

class Base2 :public Base

{

public:

Base2()

{

cout << "Base2,x= " << x << endl;

}

};

class Derived :public Base1, public Base2

{

public:

Derived()

{

cout << "Derived,x= " << x << endl;

}

};

int main()

{

Derived obj;

system("pause");

return 0;

}

上邊的代碼表面上看類Base1和類Base2是從同一個基類Base派生出來的,但是其對應的卻是基類Base的兩個不同的復制。因此,當派生類Derived要訪問變量x時不知從哪條路徑去尋找,從而引發二義性問題。

上述代碼對應的類層次結構如圖1所示,屬于非虛基類的類層次結構。要解決該問題,需要引入虛基類,其具體的做法是將公共基類聲明為虛基類,這樣這個公共基類就只有一個拷貝,從而不會出現二義性問題。虛基類的類層次結構如圖2所示。

圖 1

圖 2

3.1虛基類

虛基類的聲明是在派生類的聲明過程中進行的,其聲明的一般形式為:

class<派生類名>:virtual <派生方式><基類名>

這種派生方式叫做虛擬繼承,虛基類關鍵字的作用范圍和派生方式與一般派生類的聲明一樣,只對緊跟其后的基類起作用。聲明了虛基類以后,虛基類的成員在進一步的派生過程中和派生類一起維護同一個內存拷貝。

#include

using namespace std;

class Base

{

public:

Base()

{

x = 1;

}

protected:

int x;

};

class Base1 :virtual public Base

{

public:

Base1()

{

cout << "Base1,x= " << x << endl;

}

};

class Base2 :virtual public Base

{

public:

Base2()

{

cout << "Base2,x= " << x << endl;

}

};

class Derived :public Base1, public Base2

{

public:

Derived()

{

cout << "Derived,x= " << x << endl;

}

};

int main()

{

Derived obj;

system("pause");

return 0;

}

在上述代碼中,由于把公共基類Base聲明為類Base1和Base2的虛基類,所以由類Base1和類Base2派生的類Derived只有一個基類Base,消除了二義性。

3.2虛基類構造函數和初始化

虛基類的初始化與一般的多繼承的初始化在語法上是一樣的,但是構造函數的執行順序不同。主要在以下方面:

虛基類的構造函數的執行在非虛基類的構造函數之前;

若同一層次中包含多個虛基類,這些虛基類的構造函數按照他們被聲明的先后順序執行;

若虛基類由非虛基類派生而來,則仍然先執行基類的構造函數,再執行派生類的構造函數。

#include

using namespace std;

class Base

{

public:

Base(int x1)

{

x = x1;

cout << "Base,x= " << x << endl;

}

protected:

int x;

};

class Base1 :virtual public Base

{

int y;

public:

Base1(int x1, int y1) :Base(x1)

{

y = y1;

cout << "Base1 ,y=" << y << endl;

}

};

class Base2 :virtual public Base

{

int z;

public:

Base2(int x1, int z1) :Base(x1)

{

z = z1;

cout << "Base2,z= " << z << endl;

}

};

class Derived :public Base1, public Base2

{

int xyz;

public:

Derived(int x1, int y1, int z1, int xyz1) :Base(x1), Base1(x1,y1), Base2(x1,z1)

{

xyz = xyz1;

cout << "Derived,xyz = " << xyz << endl;

}

};

int main()

{

Derived obj(1, 2, 3, 4);

system("pause");

return 0;

}

上邊的代碼中,虛基類Base的構造函數只執行了一次,這是因為當派生類Derived調用了虛基類Base的構造函數之后,類Base1和Base2對虛基類Base構造函數的調用就被忽略,這是初始化虛基類和初始化非虛基類的不同。

在使用虛基類時要注意:

虛基類的關鍵字virtual與派生方式的關鍵字public,private,protected的書寫位置無關緊要,可以先寫虛基類的關鍵字,也可以先寫派生 方式的關鍵字;

一個基類在作為某些類的虛基類的同時可以作為另一些類的非虛基類;

虛基類構造函數的參數必須由最新派生出來的類負責初始化,即使不是直接繼承也應如此。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73623

原文標題:C++多繼承的二義性問題

文章出處:【微信號:gh_bee81f890fc1,微信公眾號:面包板社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C++之STL算法()

    C++之STL算法()
    的頭像 發表于 07-18 14:49 ?1035次閱讀
    <b class='flag-5'>C++</b>之STL算法(<b class='flag-5'>二</b>)

    【好資料系列】C++實驗 繼承與派生——教師工資計算

    C++實驗繼承與派生——教師工資計算.doc
    發表于 08-05 20:41

    【微信精選】C++的精髓類和繼承就該這么理解!

    中的公有成員。C++繼承 以下例子:定義了一個基類base,定義了一個子類sum,子類繼承了基類base,#include class sum: public base{public: int add
    發表于 08-15 09:41

    C++ 繼承類 虛基類分享

    /details/1027495131.繼承派生類有多個基類或者虛基類,同一個類不能多次作為某個派生類的直接基類,但可以作為一個派生類的間接基類;class QUEUE: STACK, STACK{...
    發表于 07-02 06:54

    MC三維重建算法的二義性消除研究

    面繪制法進行三維重建是三維重建技術的主要方法,Marching Cubes(移動立方體)算法是經典的面繪制法。本文在剖析了MC 算法的基礎上,針對其存在的二義性問題,給出了消除二義性
    發表于 01-22 12:02 ?21次下載

    C++內部類的實現及應用

    多重繼承一直是C++語言中一個廣受爭議的語言特征。一般認為,在面向對象設計中應該謹慎使用多重繼承。文章分析了C++中多重繼承實現的復雜性并對
    發表于 06-28 17:59 ?50次下載
    <b class='flag-5'>C++</b>內部類的實現及應用

    繼承與派生_實驗3

    c++面向對象課程實驗指導書題目_繼承與派生。
    發表于 01-14 16:25 ?0次下載

    面向對象的程序設計(C++

    面向對象的程序設計(C++).面向對象的基本思想 C++C的非面向對象擴充 繼承性與派生類 類庫和基于C++的良好OOP風格。
    發表于 03-22 14:40 ?0次下載

    C++實驗 繼承與派生——教師工資計算

    C++實驗 繼承與派生——教師工資計算
    發表于 12-30 14:50 ?1次下載

    Visual C++教程之C++的基礎知識介紹

    本文檔的主要內容詳細介紹的是Visual C++教程之C++的基礎知識介紹主要內容包括了:1 類和對象,2 類的成員及特性,3 繼承和派生類
    發表于 02-15 15:59 ?9次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎知識介紹

    C++程序設計教程之繼承的詳細資料說明

    本文檔的詳細介紹的是C++程序設計教程之繼承的詳細資料說明主要內容包括了:1.繼承結構 ( Inheritance Structure ) ,2.訪問父類成員 ( Access Father’s
    發表于 02-22 11:24 ?98次下載
    <b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>繼承</b>的詳細資料說明

    C++中類的繼承訪問級別學習總結(

    上一篇文章我們介紹了c++中類的繼承學習總結;今天我們繼續來分享c++中類的繼承中的訪問級別的學習總結。一、繼承中的訪問級別學習:1、子類是
    的頭像 發表于 12-24 16:10 ?736次閱讀

    STM32 C++編程系列:STM32 C++代碼封裝初探

    一、STM32與面向對象編程上一章中提到了,C++的核心之一就在于面向對象思想。相比C語言常用的面向過程編程,面向對象編程的優勢在于繼承、封裝、多態的特性,利用這種思想更有助于我們的程序實現模塊化
    發表于 12-08 11:06 ?13次下載
    STM32 <b class='flag-5'>C++</b>編程系列<b class='flag-5'>二</b>:STM32 <b class='flag-5'>C++</b>代碼封裝初探

    使用Vivado Block Design設計解決項目繼承性問題

    使用Vivado Block Design設計解決了項目繼承性問題,但是還有個問題,不知道大家有沒有遇到,就是新設計的自定義 RTL 文件無法快速的添加到Block Design中
    的頭像 發表于 02-13 11:02 ?3124次閱讀

    怎樣在Java中實現繼承

    Java是一種面向對象的只允許單繼承的語言,那么怎樣在Java中實現繼承呢? 2 方法 1. 多層繼承 如果要直接繼承類,子類
    的頭像 發表于 02-17 14:55 ?1326次閱讀
    主站蜘蛛池模板: 99精品成人无码A片观看金桔| 亚洲呦女专区| 永久免费看A片无码网站四虎| brazzers欧美孕交| 国产伦精品一区二区免费| 久久嫩草影院网站| 色女仆影院| 依人青青青在线观看| 成人国产精品免费网站| 精品亚洲国产成AV人片传媒| 日本漫画之无彩翼漫画| 一攻多受h嗯啊巨肉bl巨污| 打开双腿狠狠蹂躏蜜桃臀| 久久99国产精品一区二区| 日韩精品一区二区三区AV在线观看| 亚洲视频成人| 高清 仑乱 一级 a| 久久全国免费观看视频| 午夜精品久久久久久影视riav| 67194con免费福和视频| 国产揄拍国产精品| 轻轻cao| 娇小老少配xxxxx| 啪啪漫画无遮挡全彩h网站| 亚洲精品嫩草研究院久久| 成人国内精品久久久久影院| 久久免费精彩视频| 亚洲精品国产AV成人毛片| 成人在线视频观看| 免费精品国偷自产在线| 亚洲午夜久久久精品影院| 国产A级毛片久久久久久久| 男男h开荤粗肉h文1v1| 亚洲熟伦熟女专区| 国产精品99AV在线观看| 欧美色妞AV重囗味视频| 在线免费观看国产视频| 狠狠干老司机| 午夜福利08550| 大桥未久在线看| 欧美精品一区二区三区视频|