詳解——菱形繼承及菱形虛擬繼承

目錄

一,菱形繼承

1.1單繼承

1.2多繼承

1.3菱形繼承

1.4菱形繼承的問題

1.5虛擬繼承解決數據冗余和二義性的原理

二.繼承的總結和反思


一,菱形繼承

C++三大特性——繼承-CSDN博客

1.1單繼承

單繼承:一個子類只有一個直接父類時稱這個繼承關系為單繼承

1.2多繼承

多繼承:一個子類有兩個或以上直接父類時稱這個繼承關系為多繼承

1.3菱形繼承

菱形繼承:菱形繼承是多繼承的一種特殊情況

1.4菱形繼承的問題

菱形繼承的問題:從下面的對象成員模型構造,可以看出菱形繼承有數據冗余和二義性的問題。在Assistant的對象中Person成員會有兩份。

class Person
{
public:string _name; // 姓名
};
class Student : public Person
{
protected:int _num; //學號
};
class Teacher : public Person
{
protected:int _id; // 職工編號
};
class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修課程
};
void Test()
{// 這樣會有二義性無法明確知道訪問的是哪一個Assistant a;//a._name = "peter";  錯誤// 需要顯示指定訪問哪個父類的成員可以解決二義性問題,但是數據冗余問題無法解決a.Student::_name = "xxx";a.Teacher::_name = "yyy";
}

虛擬繼承可以解決菱形繼承的二義性和數據冗余的問題。如上面的繼承關系,在Student和Teacher的繼承Person時使用虛擬繼承,即可解決問題。需要注意的是,虛擬繼承不要在其他地方去使用

class Person
{
public:string _name; // 姓名
};
class Student : virtual public Person
{
protected:int _num; //學號
};
class Teacher : virtual public Person
{
protected:int _id; // 職工編號
};
class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修課程
};
void Test()
{Assistant a;a._name = "peter";
}

1.5虛擬繼承解決數據冗余和二義性的原理

為了研究虛擬繼承原理,我們給出了一個簡化的菱形繼承繼承體系,再借助內存窗口觀察對象成員的模型。

class A
{
public:int _a;
};
// class B : public A
class B : virtual public A
{
public:int _b;
};
// class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};
int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

下圖是菱形繼承的內存對象成員模型:這里可以看到數據冗余

下圖是菱形虛擬繼承的內存對象成員模型:這里可以分析出D對象中將A放到的了對象組成的最下面,這個A同時屬于B和C,那么B和C如何去找到公共的A呢?這里是通過了B和C的兩個指針,指向的一張表。這兩個指針叫虛基表指針,這兩個表叫虛基表。虛基表中存的偏移量。通過偏移量可以找到下面的A

// 有人可能會有疑問為什么D中B和C部分要去找屬于自己的A?那么大家看看當下面的賦值發生時,d是不是
要去找出B/C成員中的A才能賦值過去?
D d;
B b = d;
C c = d;

下面是上面的Person關系菱形虛擬繼承的原理解釋:

二.繼承的總結和反思

1. 很多人說C++語法復雜,其實多繼承就是一個體現。有了多繼承,就存在菱形繼承,有了菱形繼承就有菱形虛擬繼承,底層實現就很復雜。所以一般不建議設計出多繼承,一定不要設計出菱形繼承。否則在復雜度及性能上都有問題。


2. 多繼承可以認為是C++的缺陷之一,很多后來的語言都沒有多繼承,如Java

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

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

相關文章

javaScript解決手機瀏覽器下載為圖片之后,圖片漆黑無法保存的問題

pc端能正常下載圖片并查看 手機移動端下載的圖片全是黑色的并且無法保存,這個問題可能與移動瀏覽器的安全策略有關 解決辦法:使用Blob對象和createObjectURL方法來創建一個臨時URL,然后將其賦給鏈接的href屬性下載: // 轉blob函…

anaconda安裝配置

創建分區 conda create -n cpu 安裝Cpu版本 https://pytorch.org/ conda install pytorch torchvision torchaudio cpuonly -c pytorch 激活環境 conda activate cpu 驗證 退出當前分區 conda deactivate 安裝GPU版本 創建分區conda create -n gpu 激活環境 conda…

Java面向對象(高級)-- final關鍵字的使用

文章目錄 一、 final的意義二、 final的使用(1) final修飾類(2) final修飾方法(3) final修飾變量1. 修飾成員變量1.1 舉例11.2 舉例2 2. 修飾局部變量2.1 舉例12.2 舉例2 (4)final搭…

java協程操作mysql數據庫

我的項目: nanshaws/nettyWeb: 復習一下netty,并打算做一個web項目出來 (github.com) 最近在項目中分別添加了虛擬線程操作mysql數據庫,和用協程操作mysql數據庫 同理先跟我這個博客操作一下前面的:就單純代碼的時候進行修改&a…

TikTok與精神健康:社交媒體在壓力時代的作用

在當今數字化和社交化的時代,社交媒體已成為人們生活中不可或缺的一部分。其中,TikTok作為一款備受歡迎的短視頻應用,不僅改變了人們的娛樂方式,也對精神健康產生了深遠的影響。 本文將深入探討TikTok在壓力時代對精神健康的作用…

2023年中國油田工程建設市場規模現狀及行業競爭分析[圖]

油田工程建設是在確定油氣田有開發生產的價值的基礎上,進行系統的工程建設,油田工程建設包括井場建設、管道施工、土石方工程、道路建設及綠化等服務。 油田工程建設主要內容 資料來源:共研產業咨詢(共研網) 油田服務…

oapi-codegen 安裝和使用

背景描述 oapi-codegen 是代碼自動生成工具,其大致邏輯是:(1)編寫遵循 openAPI 規范的 yaml 格式 api 接口文檔;(2)使用 oapi-codegen 使用 yaml 文件生成 gin 框架的 server 端代碼。 除此以…

編輯 | 古代漢語知識

文章目錄 文字通假字古今字異體字(了解) 詞匯古漢語中的單音詞與雙音詞(掌握)詞的本義與引申義的特點和主要差異(掌握)詞的古義與今義的特點和主要差異(掌握)與現代漢語用法相同與現…

反向傳播BP算法

神經網絡的反向傳播 反向傳播機制與代碼微分引擎與代碼原理闡述 如需轉載,請注明出處! 如有幫助點贊收藏關注! 反向傳播機制與代碼 這里主要介紹反向傳播是如何運作的,代碼中會加注釋,便于大家理解。 在訓練神經網絡時…

抖音商城小程序源碼系統 附帶完整的搭建教程

大家好啊,今天小編來給大家分享一款抖音商城小程序源碼系統。這可是當下最熱門的的項目之一。。抖音作為國內最大的短視頻平臺之一,擁有龐大的用戶群體和豐富的社交功能。為了滿足用戶在抖音上購物和交易的需求,抖音商城小程序應運而生。 以…

租車系統開發/多功能租車平臺微信小程序源碼/汽車租賃系統源碼/汽車租賃小程序系統

源碼介紹: 多功能租車平臺微信小程序源碼,作為汽車租賃、摩托車租車平臺系統源碼,是小程序系統。基于微信小程序的汽車租賃系統源碼。 開發環境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclip…

拆解:淘寶客新玩法之微信淘禮金創建怎么做

最近看到一種新的淘寶客玩法,迫不及待的想分享給大家。微信公眾號查券大家都不陌生,也有不少人都在做這個。最近看到有人在做微信公眾號創建淘禮金。之所以說這個玩法新是因為目前大多數淘客還在做返利。返利有周期長、提現有門檻等痛點。 微信公眾號創建…

基于Springcloud微服務框架智慧工地系統源碼

建筑行業快速發展,各建筑工程的建設規模在不斷擴大,各崗位工作人員的工作內容所涉及的方面也越來越廣泛。隨著信息技術水平不斷提高,人工記錄的方式已經不能夠滿足大項目的管理要求,就此,創造出一種新型的施工管理技術——智慧工地…

攜程token

網址:https://flights.ctrip.com/ 記錄一下這個要我狗命的token 原本以為解決驗證碼就能繼續查機票信息,奈何太年輕,或者說原本以為這個頭部信息的token不重要,其實還是很重要的。 關于查價格 ,如果說查詢頻繁之后就…

小型內衣褲洗衣機哪個牌子好?性價比小型洗衣機推薦

內衣內褲應該如何清洗才能實現在不傷衣的同時有能夠洗干凈呢?其實除了使用溫水搭配手洗以外,還有一些清洗方式,那就是選擇一臺專門為內衣定制的內衣洗衣機。目前內衣洗衣機由于精致小巧,方便安裝,方便使用,…

關于內存與實際數據之間一些理解

//// 16位無符號強轉有符號 測試用例// 由于第一位表示正負的位是0,強制轉換有符號后,仍然是0,所以無影響 0-32767 (3276715個1,最左邊符號位仍然是0)之間都是無影響的unsigned short* pUS new unsigned s…

分布式冪等

分布式冪等 在分布式系統、網絡通信和數據庫操作中,冪等性是一個非常重要的概念,特別是在面對可能發生網絡故障、消息重復、或者系統崩潰等情況時。 舉個簡單的例子,考慮一個銀行轉賬的操作。如果轉賬操作是冪等的,那么無論你執…

PC分頁操作以及loading效果

page-size 每頁顯示條目個數 current-page 當前頁數 total 數據總數 current-change【currentPage 改變時會觸發】 切換分頁時會先加載,等在接口數據,接口返回,加載會關閉(在獲取接口數據完畢哪里加上this.loadingfalse&#xff0…

低權限(無權限)時如何在mysql客戶端控制臺的大量輸出中快速定位mysql死鎖或慢sql

查看mysql的查看死鎖的方式很多,但很多時候我們普通開發者的權限比較低,無法執行某命令。比如本次就準備使用 SHOW ENGINE INNODB STATUS;命令,但客戶端提示權限不夠。后來本人找到了另一條低權限的命令 show full PROCESSLIST;但是show fu…

比例減壓閥放大器選型

控制閥型如比例插裝閥、比例方向閥、比例壓力閥、比例流量閥、比例疊加閥等,安裝方式有插式及導軌卡槽式,輸入指令可選0-10V、4-20mA、10V、0-5V,輸出電流可選最大3A,適用各大品牌不帶電反饋常規比例閥匹配度,控制比例…