最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++多繼承(多重繼承)的實現(xiàn)

 更新時間:2023年04月18日 10:24:17   作者:C語言中文網(wǎng)  
多繼承容易讓代碼邏輯復(fù)雜、思路混亂,本文主要介紹了C++多繼承(多重繼承)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在前面的例子中,派生類都只有一個基類,稱為單繼承(Single Inheritance)。除此之外,C++也支持多繼承(Multiple Inheritance),即一個派生類可以有兩個或多個基類。

多繼承容易讓代碼邏輯復(fù)雜、思路混亂,一直備受爭議,中小型項目中較少使用,后來的 Java、C#、PHP 等干脆取消了多繼承。

多繼承的語法也很簡單,將多個基類用逗號隔開即可。例如已聲明了類A、類B和類C,那么可以這樣來聲明派生類D:

class D: public A, private B, protected C{
    //類D新增加的成員
}

D 是多繼承形式的派生類,它以公有的方式繼承 A 類,以私有的方式繼承 B 類,以保護的方式繼承 C 類。D 根據(jù)不同的繼承方式獲取 A、B、C 中的成員,確定它們在派生類中的訪問權(quán)限。

多繼承下的構(gòu)造函數(shù)

多繼承形式下的構(gòu)造函數(shù)和單繼承形式基本相同,只是要在派生類的構(gòu)造函數(shù)中調(diào)用多個基類的構(gòu)造函數(shù)。以上面的 A、B、C、D 類為例,D 類構(gòu)造函數(shù)的寫法為:

D(形參列表): A(實參列表), B(實參列表), C(實參列表){
    //其他操作
}

基類構(gòu)造函數(shù)的調(diào)用順序和和它們在派生類構(gòu)造函數(shù)中出現(xiàn)的順序無關(guān),而是和聲明派生類時基類出現(xiàn)的順序相同。仍然以上面的 A、B、C、D 類為例,即使將 D 類構(gòu)造函數(shù)寫作下面的形式:

D(形參列表): B(實參列表), C(實參列表), A(實參列表){
    //其他操作
}

那么也是先調(diào)用 A 類的構(gòu)造函數(shù),再調(diào)用 B 類構(gòu)造函數(shù),最后調(diào)用 C 類構(gòu)造函數(shù)。

下面是一個多繼承的實例:

#include <iostream>
using namespace std;
//基類
class BaseA{
public:
    BaseA(int a, int b);
    ~BaseA();
protected:
    int m_a;
    int m_b;
};
BaseA::BaseA(int a, int b): m_a(a), m_b(b){
    cout<<"BaseA constructor"<<endl;
}
BaseA::~BaseA(){
    cout<<"BaseA destructor"<<endl;
}
//基類
class BaseB{
public:
    BaseB(int c, int d);
    ~BaseB();
protected:
    int m_c;
    int m_d;
};
BaseB::BaseB(int c, int d): m_c(c), m_d(d){
    cout<<"BaseB constructor"<<endl;
}
BaseB::~BaseB(){
    cout<<"BaseB destructor"<<endl;
}
//派生類
class Derived: public BaseA, public BaseB{
public:
    Derived(int a, int b, int c, int d, int e);
    ~Derived();
public:
    void show();
private:
    int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e): BaseA(a, b), BaseB(c, d), m_e(e){
    cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
    cout<<"Derived destructor"<<endl;
}
void Derived::show(){
    cout<<m_a<<", "<<m_b<<", "<<m_c<<", "<<m_d<<", "<<m_e<<endl;
}
int main(){
    Derived obj(1, 2, 3, 4, 5);
    obj.show();
    return 0;
}

運行結(jié)果:

BaseA constructor
BaseB constructor
Derived constructor
1, 2, 3, 4, 5
Derived destructor
BaseB destructor
BaseA destructor

從運行結(jié)果中還可以發(fā)現(xiàn),多繼承形式下析構(gòu)函數(shù)的執(zhí)行順序和構(gòu)造函數(shù)的執(zhí)行順序相反。

命名沖突

當(dāng)兩個或多個基類中有同名的成員時,如果直接訪問該成員,就會產(chǎn)生命名沖突,編譯器不知道使用哪個基類的成員。這個時候需要在成員名字前面加上類名和域解析符::,以顯式地指明到底使用哪個類的成員,消除二義性。

修改上面的代碼,為 BaseA 和 BaseB 類添加 show() 函數(shù),并將 Derived 類的 show() 函數(shù)更名為 display():

#include <iostream>
using namespace std;
//基類
class BaseA{
public:
    BaseA(int a, int b);
    ~BaseA();
public:
    void show();
protected:
    int m_a;
    int m_b;
};
BaseA::BaseA(int a, int b): m_a(a), m_b(b){
    cout<<"BaseA constructor"<<endl;
}
BaseA::~BaseA(){
    cout<<"BaseA destructor"<<endl;
}
void BaseA::show(){
    cout<<"m_a = "<<m_a<<endl;
    cout<<"m_b = "<<m_b<<endl;
}
//基類
class BaseB{
public:
    BaseB(int c, int d);
    ~BaseB();
    void show();
protected:
    int m_c;
    int m_d;
};
BaseB::BaseB(int c, int d): m_c(c), m_d(d){
    cout<<"BaseB constructor"<<endl;
}
BaseB::~BaseB(){
    cout<<"BaseB destructor"<<endl;
}
void BaseB::show(){
    cout<<"m_c = "<<m_c<<endl;
    cout<<"m_d = "<<m_d<<endl;
}
//派生類
class Derived: public BaseA, public BaseB{
public:
    Derived(int a, int b, int c, int d, int e);
    ~Derived();
public:
    void display();
private:
    int m_e;
};
Derived::Derived(int a, int b, int c, int d, int e): BaseA(a, b), BaseB(c, d), m_e(e){
    cout<<"Derived constructor"<<endl;
}
Derived::~Derived(){
    cout<<"Derived destructor"<<endl;
}
void Derived::display(){
    BaseA::show();  //調(diào)用BaseA類的show()函數(shù)
    BaseB::show();  //調(diào)用BaseB類的show()函數(shù)
    cout<<"m_e = "<<m_e<<endl;
}
int main(){
    Derived obj(1, 2, 3, 4, 5);
    obj.display();
    return 0;
}

請讀者注意第 64、65 行代碼,我們顯式的指明了要調(diào)用哪個基類的 show() 函數(shù)。

到此這篇關(guān)于C++多繼承(多重繼承)的實現(xiàn)的文章就介紹到這了,更多相關(guān)C++多繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)ATM系統(tǒng)程序的完整代碼

    C語言實現(xiàn)ATM系統(tǒng)程序的完整代碼

    這篇文章主要介紹了C語言實現(xiàn)ATM系統(tǒng)程序的完整代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C++?auto關(guān)鍵字的小知識點分享

    C++?auto關(guān)鍵字的小知識點分享

    這篇文章主要是來和大家介紹一些C++中的小知識點,本文將從auto關(guān)鍵字開始講起,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • C?++迭代器iterator在string中使用方法介紹

    C?++迭代器iterator在string中使用方法介紹

    迭代器是一種檢查容器內(nèi)元素并遍歷元素的數(shù)據(jù)類型。迭代器是一個變量,提供對一個容器中的對象的(間接)訪問方法,并且定義了容器中對象的范圍。迭代器可以指向容器中的某個元素,通過迭代器就可以對非數(shù)組(存儲空間不連續(xù))的數(shù)據(jù)結(jié)構(gòu)進行遍歷
    2022-10-10
  • C語言const關(guān)鍵字的用法詳解

    C語言const關(guān)鍵字的用法詳解

    今天探討const,首先來說是將變量常量化。為什么要將變量常量化,原因有諸多好處有諸多。比如可以使數(shù)據(jù)更加安全不會被修改
    2022-08-08
  • C++虛表&多態(tài)的實現(xiàn)原理分析

    C++虛表&多態(tài)的實現(xiàn)原理分析

    文章介紹了C++虛函數(shù)的實現(xiàn)機制,通過虛函數(shù)指針(vfptr)和虛函數(shù)表(vftable)實現(xiàn)多態(tài),對象包含vfptr指針,虛表存函數(shù)地址并以空指針結(jié)尾,繼承時虛表繼承并擴展,多態(tài)需基類指針引用和虛函數(shù)重寫,利用虛表實現(xiàn)動態(tài)綁定
    2025-09-09
  • 在C++中實現(xiàn)aligned_malloc的方法

    在C++中實現(xiàn)aligned_malloc的方法

    這篇文章主要介紹了在C++中實現(xiàn)aligned_malloc的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • C/C++中不同數(shù)據(jù)類型之間的轉(zhuǎn)換詳解

    C/C++中不同數(shù)據(jù)類型之間的轉(zhuǎn)換詳解

    這篇文章主要介紹了C/C++中不同數(shù)據(jù)類型之間的轉(zhuǎn)換詳解,數(shù)據(jù)類型轉(zhuǎn)換是計算機編程中常見的操作,用于將一個數(shù)據(jù)類型轉(zhuǎn)換為另一個數(shù)據(jù)類型,本文將對不同數(shù)據(jù)類型之間的轉(zhuǎn)換作出說明,需要的朋友可以參考下
    2023-10-10
  • OpenCV cv.Mat與.txt文件數(shù)據(jù)的讀寫操作

    OpenCV cv.Mat與.txt文件數(shù)據(jù)的讀寫操作

    這篇文章主要介紹了OpenCV cv.Mat 與 .txt 文件數(shù)據(jù)的讀寫操作,現(xiàn)在分享給大家,也給大家做個參考
    2018-05-05
  • C++類和對象之相關(guān)特性解讀

    C++類和對象之相關(guān)特性解讀

    這篇文章主要介紹了C++類和對象之相關(guān)特性,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • atoi和itoa函數(shù)的實現(xiàn)方法

    atoi和itoa函數(shù)的實現(xiàn)方法

    本文介紹了,atoi和itoa函數(shù)的實現(xiàn)方法,需要的朋友可以參考一下
    2013-03-03

最新評論

西充县| 金坛市| 拉萨市| 桃园县| 类乌齐县| 林甸县| 韶山市| 长海县| 阿克陶县| 鹤壁市| 曲阳县| 伊宁市| 建湖县| 家居| 长岭县| 化德县| 保定市| 如东县| 商丘市| 安阳县| 开江县| 苍山县| 阿拉尔市| 沂源县| 太原市| 武宣县| 黄浦区| 中西区| 乐业县| 扎兰屯市| 富锦市| 栾川县| 苗栗市| 基隆市| 乳山市| 合山市| 丹棱县| 鄂州市| 竹北市| 南皮县| 津南区|