網站首頁 編程語言 正文
C++支持多繼承,即允許一個類同時繼承多個類。
關于多繼承,一直以來爭議不斷,有一部分人認為多繼承會帶來大量的問題,為了解決這些問題會使得語言本身變得非常復雜,因此應當避免。另外一派認為多繼承在某些場景下可以起到非常關鍵的作用,應當予以支持。
關于多重繼承是好是壞,這是一個非常復雜的問題,網上歷來爭議不斷。因此不過多闡述,感興趣的同學可以查閱一下相關資料。僅僅從實際支持來看,目前市面上大部分的語言包括Java僅支持單繼承,只有C++等少數語言支持多繼承。這和C++的理念也有關,即認定不能通過減少語言特性來增強語言的表達力。
看完爭議之后,我們來看看究竟什么是多繼承呢?
我們來看一段代碼案例:
class A{ public: ? ? void funcA(); }; class B{ private: ? ? bool funcB() const; }; class C: public A, public B{ ... };
在這段代碼當中我們定義了兩個類A和B,然后我們創建了一個類C,同時繼承了A和B。這就是多繼承,這里要注意一點,我們必須用關鍵字public
來限定每一個基類,否則的話編譯器會默認這是一個私有繼承。
如果我們稍微修改一下代碼,就會出現一些問題,比如:
class A{ public: ? ? void func(); }; class B{ private: ? ? bool func() const; }; class C: public A, public B{ ... };
在上面這個例子當中A和B都包含了函數func
,在下面的執行語句當中會報錯。
C c; c.func();
雖然B中的func
函數是私有的,但對于編譯器來說依然是有歧義的。如果想要消除歧義,我們可以這樣調用c.A::func()。
當多繼承的父類擁有更高的繼承層級的時候,可能會出現更復雜的問題,比如多繼承菱形。也就是多個類之間的繼承關系構成了一個抽象意義上的菱形,
比如我們參考一下C++ Primer中的例子:
在上面這張圖當中,Singer
和Waiter
都繼承了Worker,而SingingWaiter
同時繼承了Singer和Waiter。從圖上來看,這似乎沒什么問題,但在實現上問題不少。
比如說,對于SingingWaiter
類來說,它當中包含了多少Worker呢?
答案是有兩個,從Singer這邊繼承了一個Worker,從Waiter又繼承了一個Worker。
那么我們這樣寫就會出現問題:
SingingWaiter sw; Worker *p = &sw;
通常這種賦值的時候,會將基類指針設置成派生類中基類對象的地址,但由于sw對象當中包含兩個Worker對象,有兩個地址,所以也會導致歧義。
我們可以使用強制轉換的方式消除歧義:
SingingWaiter sw; Worker *p = (Singer*) &sw; Worker *p = (Waiter*) &sw;
但顯然這樣的方法雖然能夠解決問題,
原文鏈接:https://mp.weixin.qq.com/s/2fD5I3GwLnDDy_dwTv15aA
相關推薦
- 2022-11-03 tomcat?集群監控與彈性伸縮詳解_Tomcat
- 2022-12-23 iOS之異常與信號使用場景分析_IOS
- 2022-04-16 C++中不得不說的map容器_C 語言
- 2022-08-29 python中requests庫安裝與使用詳解_python
- 2022-04-04 使用uniapp封裝簡易通用的ajax請求以及攜帶token去請求 (代碼優化新增請求日志和響應日志
- 2022-12-16 python字典添加值的方法及實例代碼分享_python
- 2022-02-28 VM2551:1 Component “pages/tabs/cates“ does not hav
- 2024-04-07 MyBatis批量插入的五種方式(推薦MyBatis以集合方式批量新增)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支