国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

圖文例解C++類的多重繼承與虛擬繼承

2019-11-17 05:05:12
字體:
供稿:網(wǎng)友
  在過去的學(xué)習(xí)中,我們始終接觸的單個類的繼續(xù),但是在現(xiàn)實(shí)生活中,一些新事物往往會擁有兩個或者兩個以上事物的屬性,為了解決這個問題,C++引入了多重繼續(xù)的概念,C++答應(yīng)為一個派生類指定多個基類,這樣的繼續(xù)結(jié)構(gòu)被稱做多重繼續(xù)。   舉個例子,交通工具類可以派生出汽車和船連個子類,但擁有汽車和船共同特性水陸兩用汽車就必須繼續(xù)來自汽車類與船類的共同屬性。

  由此我們不難想出如下的圖例與代碼:圖文例解C++類的多重繼續(xù)與虛擬繼續(xù)
  當(dāng)一個派生類要使用多重繼續(xù)的時候,必須在派生類名和冒號之后列出所有基類的類名,并用逗好分隔。//程序作者:管寧   
//站點(diǎn):www.cndev-lab.com   
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者   
 
#include <iostream> 
using namespace std; 
 
class Vehicle 

    public: 
        Vehicle(int weight = 0) 
        { 
            Vehicle::weight = weight; 
        } 
        void SetWeight(int weight) 
        { 
            cout<<"重新設(shè)置重量"<<endl; 
            Vehicle::weight = weight; 
        } 
        virtual void ShowMe() = 0; 
    PRotected: 
        int weight; 
}; 
class Car:public Vehicle//汽車 

    public: 
        Car(int weight=0,int aird=0):Vehicle(weight) 
        { 
            Car::aird = aird; 
        } 
        void ShowMe() 
        { 
            cout<<"我是汽車!"<<endl; 
        } 
    protected: 
        int aird; 
}; 
 
class Boat:public Vehicle//船 

    public: 
        Boat(int weight=0,float tonnage=0):Vehicle(weight) 
        { 
            Boat::tonnage = tonnage; 

        } 
        void ShowMe() 
        { 
            cout<<"我是船!"<<endl; 
        } 
    protected: 
        float tonnage; 
}; 
 
class AmphibianCar:public Car,public Boat//水陸兩用汽車,多重繼續(xù)的體現(xiàn) 

    public: 
        AmphibianCar(int weight,int aird,float tonnage) 
        :Vehicle(weight),Car(weight,aird),Boat(weight,tonnage) 
        //多重繼續(xù)要注重調(diào)用基類構(gòu)造函數(shù) 
        { 
         
        } 
        void ShowMe() 
        { 
            cout<<"我是水陸兩用汽車!"<<endl; 
        } 
}; 
int main() 

    AmphibianCar a(4,200,1.35f);//錯誤 
    a.SetWeight(3);//錯誤 
    system("pause");  
}  上面的代碼從表面看,看不出有明顯的語發(fā)錯誤,但是它是不能夠通過編譯的。這有是為什么呢?
  這是由于多重繼續(xù)帶來的繼續(xù)的模糊性帶來的問題。 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或

  先看如下的圖示:圖文例解C++類的多重繼續(xù)與虛擬繼續(xù)
  在圖中深紅色標(biāo)記出來的地方正是主要問題所在,水陸兩用汽車類繼續(xù)了來自Car類與Boat類的屬性與方法,Car類與Boat類同為AmphibianCar類的基類,在內(nèi)存分配上AmphibianCar獲得了來自兩個類的SetWeight()成員函數(shù),當(dāng)我們調(diào)用a.SetWeight(3)的時候計算機(jī)不知道如何選擇分別屬于兩個基類的被重復(fù)擁有了的類成員函數(shù)SetWeight()。   由于這種模糊問題的存在同樣也導(dǎo)致了AmphibianCar a(4,200,1.35f);執(zhí)行失敗,系統(tǒng)會產(chǎn)生Vehicle”不是基或成員的錯誤。  以上面的代碼為例,我們要想讓AmphibianCar類既獲得一個Vehicle的拷貝,而且又同時共享用Car類與Boat類的數(shù)據(jù)成員與成員函數(shù)就必須通過C++所提供的虛擬繼續(xù)技術(shù)來實(shí)現(xiàn)。  我們在Car類和Boat類繼續(xù)Vehicle類出,在前面加上virtual要害字就可以實(shí)現(xiàn)虛擬繼續(xù),使用虛擬繼續(xù)后,當(dāng)系統(tǒng)碰到多重繼續(xù)的時候就會自動先加入一個Vehicle的拷貝,當(dāng)再次請求一個Vehicle的拷貝的時候就會被忽略,保證繼續(xù)類成員函數(shù)的唯一性。

  修改后的代碼如下,注重觀察變化://程序作者:管寧   
//站點(diǎn):www.cndev-lab.com   
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者   
 
#include <iostream> 
using namespace std; 
 
class Vehicle 

    public: 
        Vehicle(int weight = 0) 

        { 
            Vehicle::weight = weight; 
            cout<<"載入Vehicle類構(gòu)造函數(shù)"<<endl; 
        } 
        void SetWeight(int weight) 
        { 
            cout<<"重新設(shè)置重量"<<endl; 
            Vehicle::weight = weight; 
        } 
        virtual void ShowMe() = 0; 
    protected: 
        int weight; 
}; 
class Car:virtual public Vehicle//汽車,這里是虛擬繼續(xù) 

    public: 
        Car(int weight=0,int aird=0):Vehicle(weight) 
        { 
            Car::aird = aird; 
            cout<<"載入Car類構(gòu)造函數(shù)"<<endl; 
        } 
        void ShowMe() 
        { 
            cout<<"我是汽車!"<<endl; 
        } 
    protected: 
        int aird; 
}; 
 
class Boat:virtual public Vehicle//船,這里是虛擬繼續(xù) 

    public: 
        Boat(int weight=0,float tonnage=0):Vehicle(weight) 
        { 
            Boat::tonnage = tonnage; 
            cout<<"載入Boat類構(gòu)造函數(shù)"<<endl; 
        } 
        void ShowMe() 
        { 
            cout<<"我是船!"<<endl; 
        } 
    protected: 

        float tonnage; 
}; 
 
class AmphibianCar:public Car,public Boat//水陸兩用汽車,多重繼續(xù)的體現(xiàn) 

    public: 
        AmphibianCar(int weight,int aird,float tonnage) 
        :Vehicle(weight),Car(weight,aird),Boat(weight,tonnage) 
        //多重繼續(xù)要注重調(diào)用基類構(gòu)造函數(shù) 
        { 
            cout<<"載入AmphibianCar類構(gòu)造函數(shù)"<<endl; 
        } 
        void ShowMe() 
        { 
            cout<<"我是水陸兩用汽車!"<<endl; 
        } 
        void ShowMembers() 
        { 
            cout<<"重量:"<<weight<<"頓,"<<"空氣排量:"<<aird<<"CC,"<<"排水量:"<<tonnage<<"頓"<<endl; 
        } 
}; 
int main() 

    AmphibianCar a(4,200,1.35f); 
    a.ShowMe(); 
    a.ShowMembers(); 
    a.SetWeight(3); 
    a.ShowMembers(); 
    system("pause");  
}  注重觀察類構(gòu)造函數(shù)的構(gòu)造順序。

  雖然說虛擬繼續(xù)與虛函數(shù)有一定相似的地方,但讀者務(wù)必要記住,他們之間是絕對沒有任何聯(lián)系的! 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 迁西县| 新民市| 弋阳县| 邢台市| 宁明县| 留坝县| 嘉义市| 紫金县| 石泉县| 贵州省| 电白县| 深水埗区| 泸溪县| 玉田县| 抚松县| 芦山县| 通州区| 大厂| 陵川县| 康平县| 香格里拉县| 上高县| 南部县| 乌鲁木齐市| 无锡市| 巴青县| 临泉县| 麻江县| 澄城县| 白朗县| 花莲市| 兴城市| 洪江市| 嘉祥县| 台安县| 芦山县| 高邮市| 砀山县| 乌兰县| 扶风县| 灵台县|