【C++學習手札】一文帶你認識C++虛繼承??

????????????????????????????????????????食用指南:本文在有C++基礎的情況下食用更佳??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?🍀本文前置知識:C++虛函數(很重要,內部剖析)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??今日夜電波僕らのつづき—柊優花

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1:06?━━━━━━?💟──────── 3:51
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????🔄 ? ?? ? ? ? ?? ? ???

??????????????????????????????????????💗關注👍點贊🙌收藏您的每一次鼓勵都是對我莫大的支持😍?


目錄

🌸一、虛繼承的引入—菱形繼承

什么是菱形繼承?

?????????🌰

? ? ? ? 內層結構?

?💮二、什么是虛繼承?

????????語法定義

? ? ? ??🌰

????????內層結構

🌺三、使用虛繼承的原因

🌼四、使用虛繼承需注意


🌸一、虛繼承的引入—菱形繼承

????????什么是菱形繼承?

????????菱形繼承是指在繼承關系中存在一個派生類同時繼承自兩個或多個基類,而這些基類又共同繼承自同一個基類。這樣就會導致派生類中存在多個相同的基類子對象,從而造成資源浪費和二義性問題。

?????????🌰

class Animal{public:int data;};class Sheep :public Animal{public:};class Tuo :public Animal{public:};class SheepTuo :public Sheep, public Tuo{public:};int main(int argc, char* argv[]){SheepTuo st;//SheepTuo 從Sheep中繼承data 從Tuo繼承data 就產生二義性//st.data = 200;//err//第一種方式:加作用域解決st.Sheep::data = 200;st.Tuo::data = 300;return 0;}

? ? ? ? 內層結構?

????????這段代碼的內層結構如下:? ? ? ??

????????這就是典型的菱形繼承的例子,SheepTuo 從Sheep中繼承data 從Tuo繼承data 就產生二義性。但是我們可以采用加作用域的方式解決問題。

? ? ? ? 那有沒有更加優的解決辦法呢?答案是虛繼承!?


?💮二、什么是虛繼承?

? ? ? ?本文為虛函數后的知識, 強烈建議各位先去了解一下此文:

? ? ? ? ? ? ??????????? ?🍀本文前置知識:C++虛函數(很重要,內部剖析)

????????在多繼承中,如果一個派生類從兩個或多個基類繼承,而這些基類又共同繼承自同一個基類,那么就會出現菱形繼承問題。這種情況下,派生類將會有兩份相同的基類成員,導致二義性和冗余。

????????虛繼承通過在派生類對共同基類的繼承前加上關鍵字"virtual"來解決這個問題。使用虛繼承后,共同基類的成員只會在派生類中存在一份,從而避免了二義性和冗余。

????????通過使用虛繼承,可以確保多繼承中的共同基類只會在派生類中存在一份,從而解決菱形繼承問題。

????????語法定義

class Base {};class Derived : virtual public Base {};

? ? ? ??🌰

class Animal{public:int data;};class Sheep :virtual public Animal{public:};class Tuo :virtual public Animal{public:};class SheepTuo :public Sheep, public Tuo{public:};int main(int argc, char* argv[]){SheepTuo st;//在加入virtual后二義性以及冗余得以解決st.data = 200;return 0;}

????????內層結構

????????這段代碼的內層結構如下:?

? ? ? ? ? Animal:(未變,因為改變的不是他)

?????????Sheep:(產生了虛基指針和虛基表)

?????????Tuo:(同樣也產生了虛基指針和虛基表)

? ? ? ? ?SheepTuo:(保存了兩個父類的虛基指針)


🌺三、使用虛繼承的原因

????????敏銳的你可能已經發現了,每當使用了virtual以使用虛繼承后,相對于沒有使用虛繼承的子類,他們的的內存都加了4字節的vptr指針,而最后的最后的那個子類則是多出了兩個4字節的vptr指針,很明顯,通過內層結構圖我們得知,這兩個指針分別指向這個子類的兩個父類的虛基表vftable。之所以 產生 vbptr和vbtable目的 是為了保證 不管多少個繼承 虛基類的數據只有一份。

? ? ? ? ?一圖讓你明白~


🌼四、使用虛繼承需注意

????????虛繼承只有在多繼承時才有用。虛繼承只能解決具備公共祖先的多繼承所帶來的二義性問題,不能解決沒有公共祖先的多繼承的。單繼承以及只有一層的繼承都是不行的。

????????虛繼承:不管繼承多少次 虛基類 只有一份。


????????????????感謝你耐心的看到這里?( ′・?・` )比心,如有哪里有錯誤請踢一腳作者o(╥﹏╥)o!??

?????????????????????????????????

?????????????????????????????????????????????????????????????????給個三連再走嘛~??????

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43144.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

創建密碼庫/創建用戶帳戶/更新 Ansible 庫的密鑰/ 配置cron作業

目錄 創建密碼庫 創建用戶帳戶 更新 Ansible 庫的密鑰 配置cron作業 創建密碼庫 按照下方所述,創建一個 Ansible 庫來存儲用戶密碼: 庫名稱為 /home/curtis/ansible/locker.yml 庫中含有兩個變量,名稱如下: pw_developer&#…

神經網絡基礎-神經網絡補充概念-39-梯度消失與梯度爆炸

簡介 梯度消失和梯度爆炸是在深度神經網絡中訓練過程中可能出現的問題,導致模型難以訓練或無法收斂。這些問題與反向傳播算法中的梯度計算有關。 概念 梯度消失(Gradient Vanishing):在深層神經網絡中,特別是具有很…

File inclusion

文章目錄 File inclusion(local)File inclusion(remote) File inclusion(local) 隨便選擇一個點擊提交,提交后觀察 url ?filename 我們可以使用相對路徑../../../../../訪問我們想要看到的文件內容 查看windows系統的主機映射文件../../../../Windows/System32/…

ShardingSphere 可觀測 SQL 指標監控

ShardingSphere并不負責如何采集、存儲以及展示應用性能監控的相關數據,而是將SQL解析與SQL執行這兩塊數據分片的最核心的相關信息發送至應用性能監控系統,并交由其處理。 換句話說,ShardingSphere僅負責產生具有價值的數據,并通過…

Go 語言中排序的 3 種方法

原文鏈接: Go 語言中排序的 3 種方法 在寫代碼過程中,排序是經常會遇到的需求,本文會介紹三種常用的方法。 廢話不多說,下面正文開始。 使用標準庫 根據場景直接使用標準庫中的方法,比如: sort.Intsso…

【C++】AVL樹(平衡二叉樹)

目錄 一、AVL樹的定義二、AVL樹的作用三、AVL樹的插入操作插入——平衡因子的更新插入——左單旋插入——右單旋插入——左右雙旋插入——右左雙旋 四、ALVL樹的驗證五、AVL樹的性能 一、AVL樹的定義 AVL樹,全稱 平衡二叉搜索(排序)樹。 二…

一次Linux圖形化界面恢復

一次Linux 圖形化界面恢復 一次Linux 圖形化界面恢復出現問題場景問題排查 一次Linux 圖形化界面恢復 出現問題場景 使用xmanager遠程連接虛機的CentOS7系統圖形界面出現已拒絕x11轉移申請問題,在折騰X11過程中,安裝與卸載的過程中不小心把xorg-x11-xa…

HCIP的交換機實驗

題目 拓撲圖 PC1/3接口用access 創建WLAN LSW1 創建WLAN [lsw1]vlan batch 2 to 6[lsw1-Ethernet0/0/1]p [lsw1-Ethernet0/0/1]port l [lsw1-Ethernet0/0/1]port link- [lsw1-Ethernet0/0/1]port link-flap [lsw1-Ethernet0/0/1]port link-type acc [lsw1-Ethernet0/0…

kubeasz在線安裝K8S集群單master集群(kubeasz安裝之二)

一、介紹 Kubeasz 是一個基于 Ansible 自動化工具,用于快速部署和管理 Kubernetes 集群的工具。它支持快速部署高可用的 Kubernetes 集群,支持容器化部署,可以方便地擴展集群規模,支持多租戶,提供了強大的監控和日志分…

Bigemap Pro國產基礎軟件介紹——一款多源數據處理軟件

一、軟件簡介 Bigemap Pro是由成都比格圖數據處理有限公司(下稱”BIGEMAP”)開發和發行的國產大數據處理基礎軟件。Bigemap Pro是在BIGEMAP GIS Office基礎上,經過十年的用戶積累與反饋和技術更新迭代出的新一代基礎軟件產品。Bigemap Pro國產基礎軟件集成了數據采…

【Diffusion】李宏毅2023機器學習Diffusion筆記

文章目錄 1 想法概述2 實際過程階段1 Add Noise階段2 Denoise 3 數學原理4 為什么推理時要額外加入noise5 一些不知道對不對的Summary 1 想法概述 從一張充滿噪聲的圖中不斷denoise,最終得到一張clear的圖片。為了確定當前圖片中噪聲占比的大小,同時輸入…

rust踩雷筆記(1)——切片傳參和解引用賦值

最近學習rust,網上資料還是很有限,做題遇到的問題,有時需要自己試驗。把自己做題過程遇到的問題,和試驗的結論,做一些簡單記錄。 閱讀下列文字和代碼 用切片(的引用)做參數要非常小心&#xff…

LVS負載均衡之--Keepalived模式(超詳細)

一.Keepalived概述 Keepalived起初是專門針對LVS設計的一款強大的輔助工具,主要用來提供故障切換和健康檢查功能-----判斷LVS負載調度器,節點服務器的可用性,及時隔離并替換為新的服務器,當故障主機恢復后將其重新加入群集中Keep…

【數據結構】二叉樹

🐇 🔥博客主頁: 云曦 📋系列專欄:數據結構 💨吾生也有涯,而知也無涯 💛 感謝大家👍點贊 😋關注📝評論 文章目錄 前言一、樹的概念及結構&#x…

簡單理解Python中的深拷貝與淺拷貝

I. 簡介 深拷貝會遞歸的創建一個完全獨立的對象副本,包括所有嵌套的對象,而淺拷貝只復制嵌套對象的引用,不復制嵌套對象本身。 簡單來說就是兩者都對原對象進行了復制,因此使用is運算符來比較新舊對象時,返回的都是F…

java把數字轉換成漢字 java 數字轉漢字

使用java將數字轉化為中文漢字_java數字轉中文_javaerly的博客-CSDN博客 package com.unicom.apartment.utils;public class NumUtil {public static String convert(int number) {if(number < 0){return "";}if(number 1){return "當天";}//數字對應的…

C#實現普通的語音播報

Windows有文字轉語音功能&#xff0c;C#提供了調用的類庫Interop.SpeechLib.dll 使用方法很簡單&#xff0c;在你的項目中添加Interop.SpeechLib.dll引用&#xff0c;在類中引用&#xff1a; using SpeechLib;這里提供一個CVoice類 幫助實現語音播報 public class CVoice{pri…

【5G 核心網】5G 多PDU會話錨點技術介紹

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G算力網絡技術標準研究。 博客…

Spring Boot(六十四):SpringBoot集成Gzip壓縮數據

1 實現思路 2 實現 2.1 創建springboot項目 2.2 編寫一個接口,功能很簡單就是傳入一個Json對象并返回 package com.example.demo.controller;import com.example.demo.entity.Advertising; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframewo…

LeetCode150道面試經典題-- 加一(簡單)

1.題目 給定一個由 整數 組成的 非空 數組所表示的非負整數&#xff0c;在該數的基礎上加一。 最高位數字存放在數組的首位&#xff0c; 數組中每個元素只存儲單個數字。 你可以假設除了整數 0 之外&#xff0c;這個整數不會以零開頭。 2.示例 示例 1&#xff1a; 輸入&am…