C++?多繼承詳情介紹
C++支持多繼承,即允許一個(gè)類同時(shí)繼承多個(gè)類。
關(guān)于多繼承,一直以來爭(zhēng)議不斷,有一部分人認(rèn)為多繼承會(huì)帶來大量的問題,為了解決這些問題會(huì)使得語言本身變得非常復(fù)雜,因此應(yīng)當(dāng)避免。另外一派認(rèn)為多繼承在某些場(chǎng)景下可以起到非常關(guān)鍵的作用,應(yīng)當(dāng)予以支持。
關(guān)于多重繼承是好是壞,這是一個(gè)非常復(fù)雜的問題,網(wǎng)上歷來爭(zhēng)議不斷。因此不過多闡述,感興趣的同學(xué)可以查閱一下相關(guān)資料。僅僅從實(shí)際支持來看,目前市面上大部分的語言包括Java僅支持單繼承,只有C++等少數(shù)語言支持多繼承。這和C++的理念也有關(guān),即認(rèn)定不能通過減少語言特性來增強(qiáng)語言的表達(dá)力。
看完?duì)幾h之后,我們來看看究竟什么是多繼承呢?
我們來看一段代碼案例:
class A{ public: ? ? void funcA(); }; class B{ private: ? ? bool funcB() const; }; class C: public A, public B{ ... };
在這段代碼當(dāng)中我們定義了兩個(gè)類A和B,然后我們創(chuàng)建了一個(gè)類C,同時(shí)繼承了A和B。這就是多繼承,這里要注意一點(diǎn),我們必須用關(guān)鍵字public
來限定每一個(gè)基類,否則的話編譯器會(huì)默認(rèn)這是一個(gè)私有繼承。
如果我們稍微修改一下代碼,就會(huì)出現(xiàn)一些問題,比如:
class A{ public: ? ? void func(); }; class B{ private: ? ? bool func() const; }; class C: public A, public B{ ... };
在上面這個(gè)例子當(dāng)中A和B都包含了函數(shù)func
,在下面的執(zhí)行語句當(dāng)中會(huì)報(bào)錯(cuò)。
C c; c.func();
雖然B中的func
函數(shù)是私有的,但對(duì)于編譯器來說依然是有歧義的。如果想要消除歧義,我們可以這樣調(diào)用c.A::func()。
當(dāng)多繼承的父類擁有更高的繼承層級(jí)的時(shí)候,可能會(huì)出現(xiàn)更復(fù)雜的問題,比如多繼承菱形。也就是多個(gè)類之間的繼承關(guān)系構(gòu)成了一個(gè)抽象意義上的菱形,
比如我們參考一下C++ Primer中的例子:
在上面這張圖當(dāng)中,Singer
和Waiter
都繼承了Worker,而SingingWaiter
同時(shí)繼承了Singer和Waiter。從圖上來看,這似乎沒什么問題,但在實(shí)現(xiàn)上問題不少。
比如說,對(duì)于SingingWaiter
類來說,它當(dāng)中包含了多少Worker呢?
答案是有兩個(gè),從Singer這邊繼承了一個(gè)Worker,從Waiter又繼承了一個(gè)Worker。
那么我們這樣寫就會(huì)出現(xiàn)問題:
SingingWaiter sw; Worker *p = &sw;
通常這種賦值的時(shí)候,會(huì)將基類指針設(shè)置成派生類中基類對(duì)象的地址,但由于sw對(duì)象當(dāng)中包含兩個(gè)Worker對(duì)象,有兩個(gè)地址,所以也會(huì)導(dǎo)致歧義。
我們可以使用強(qiáng)制轉(zhuǎn)換的方式消除歧義:
SingingWaiter sw; Worker *p = (Singer*) &sw; Worker *p = (Waiter*) &sw;
但顯然這樣的方法雖然能夠解決問題,
到此這篇關(guān)于C++ 多繼承詳情介紹的文章就介紹到這了,更多相關(guān)C++ 多繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼
這篇文章主要介紹了C++ 靜態(tài)成員的類內(nèi)初始化詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02C語言中調(diào)用Swift函數(shù)實(shí)例詳解
這篇文章主要介紹了C語言中調(diào)用Swift函數(shù)實(shí)例詳解的相關(guān)資料,實(shí)現(xiàn)該功能可以通過定義全局的指向Blocks的對(duì)象指針來實(shí)現(xiàn),需要的朋友可以參考下2017-07-07C++實(shí)現(xiàn)職工信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了c++實(shí)現(xiàn)職工信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C++簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用
類型轉(zhuǎn)換(type?cast),是高級(jí)語言的一個(gè)基本語法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號(hào)內(nèi)加上類型名來表示,接下來讓我們一起來詳細(xì)了解2022-04-04C語言中的內(nèi)聯(lián)函數(shù)(inline)與宏定義(#define)詳細(xì)解析
內(nèi)聯(lián)函數(shù)與宏本質(zhì)上是兩個(gè)不同的概念如果程序編寫者對(duì)于既要求快速,又要求可讀的情況下,則應(yīng)該將函數(shù)冠以inline2013-09-09VS Code 中搭建 Qt 開發(fā)環(huán)境方案分享
這篇文章主要介紹了VS Code 中搭建 Qt 開發(fā)環(huán)境方案分享的相關(guān)資料,需要的朋友可以參考下2022-12-12