當(dāng)我們談C++時(shí),我們談些什么?
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供芒市企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為芒市眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。封裝,繼承,多態(tài)。這是C++語言的三大特性,而每次在談到繼承時(shí)我們不可避免的要談到一個(gè)很重要的問題——菱形繼承。
a.菱形繼承是什么
如上圖,菱形繼承即多個(gè)類繼承了同一個(gè)公共基類,而這些派生類又同時(shí)被一個(gè)類繼承。這么做會(huì)引發(fā)什么問題呢,讓我們來看一段代碼吧!
#include<iostream> using namespace std; class Base { protected: int _base; public: void fun() { cout << "Base::fun" << endl; } }; class A:public Base { protected: int _a; }; class B : public Base { protected: int _b; }; class D :public A, public B { private: int _d; }; int main() { D d; d.fun();//編譯器報(bào)錯(cuò):調(diào)用不明確 getchar(); }
我們可以看見D的對(duì)象模型里面保存了兩份Base,當(dāng)我們想要調(diào)用我們從Base里繼承的fun時(shí)就會(huì)出現(xiàn)調(diào)用不明確問題,并且會(huì)造成數(shù)據(jù)冗余的問題,明明可以只要一份就好,而我們卻保存了兩份。
那么我們可以怎樣解決呢?
第一種解決方法,使用域限定我們所需訪問的函數(shù)
int main() { D d; d.A::fun(); d.B::fun(); getchar(); }
這樣的做法是沒有問題的,但是,這樣做非常的不方便,并且當(dāng)程序十分大的時(shí)候會(huì)造成我們思維混亂
于是,C++給了我們一個(gè)別的解決方案——虛繼承
b.虛繼承
虛繼承是什么?
如上圖,虛繼承即讓A和B在繼承Base時(shí)加上virtural關(guān)鍵字,這里需要記住不是D使用虛繼承
那么,虛繼承又是怎么解決這些煩人的問題的呢?
我們可看見在A和B中不再保存Base中的內(nèi)容,保存了一份偏移地址,然后將Base的數(shù)據(jù)保存在一個(gè)公共位置處這樣保證了數(shù)據(jù)冗余性的降低同時(shí),我們也能直接的使用d.fun()來調(diào)用Base里的fun函數(shù)。
#include<iostream> using namespace std; class Base { protected: int _base; public: void fun() { cout << "Base::fun" << endl; } }; class A:virtual public Base { protected: int _a; }; class B :virtual public Base { protected: int _b; }; class D :public A, public B { private: int _d; }; int main() { D d; d.fun(); getchar(); }
*虛繼承和虛函數(shù)是完全不同的兩個(gè)概念,希望大家不要隨意搞混,想要了解虛函數(shù)的同學(xué)可以看看博主的另一篇博文《C++的繼承&多態(tài)》http://zimomo.blog.51cto.com/10799874/1752936
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:C++之菱形繼承-創(chuàng)新互聯(lián)
分享路徑:http://www.rwnh.cn/article0/doepoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、標(biāo)簽優(yōu)化、網(wǎng)站制作、網(wǎng)站營(yíng)銷、企業(yè)網(wǎng)站制作、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容