C++從零開始的打怪升級之路(day42)

這是關于一個普通雙非本科大一學生的C++的學習記錄貼

在此前,我學了一點點C語言還有簡單的數據結構,如果有小伙伴想和我一起學習的,可以私信我交流分享學習資料

那么開啟正題

今天分享的是關于繼承的知識點

1.菱形繼承

我們有許多關于繼承的方式

1.單繼承

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

class A
{
public:int _a;
};class B : public A
{
public:int _b;
};class C : public B
{
public:int _c;
};

2.多繼承

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

class A
{
public:int _a;
};class B
{
public:int _b;
};class C : public A, public B
{
public:int _c;
};

3.菱形繼承

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

class A
{
public:int _a;
};class B : public A
{
public:int _b;
};class C : public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};

菱形繼承的問題:菱形繼承有數據冗余和二義性的問題,如上面的D對象中會出現兩份_a成員

2.菱形虛擬繼承

引出了菱形繼承的問題,我們必然有解決的辦法,下面介紹辦法及菱形虛擬繼承

class A
{
public:int _a;
};class B : virtual public A
{
public:int _b;
};class C : virtual public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};

上面就是一種最簡單的菱形虛擬繼承的模型

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

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

class A
{
public:int _a;
};class B : virtual public A
{
public:int _b;
};class C : virtual public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};

我們再次借助這個模型來了解虛擬繼承的原理

在vs環境下進入調試,內存窗口中我們可以發現,_a在對象內存的最下面,屬于B,C公共的成員,

那么如果我們將D切割給B(C),此時B(C)如何找到A呢?

這里是通過了B和C內的兩個指針,指向的一張表,這兩個指針叫做虛基表指針,虛基表中存的是偏移量,通過偏移量可以找到下面的A

4.繼承的總結與反思

1.C++語法復雜,多繼承就是一個體現,有了多繼承,就存在菱形繼承,因而有菱形虛擬繼承,底層實現就很復雜

2.多繼承可以認為是C++的一種缺陷,Java就沒有多繼承

3.繼承和組合

繼承是一種is_a的關系,也就是說每一個派生類對象都是一個基類對象

組合是一種has_a的關系,假如B組合了A,每個B對象中都有一個A對象

實際中,優先使用對象組合,而不是類繼承(組合的耦合度低,代碼維護好)

當然有些情況更適用于使用繼承,那么使用繼承也無可厚非

新手寫博客,有不對的位置希望大佬們能夠指出,也謝謝大家能看到這里,讓我們一起學習進步吧!

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

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

相關文章

【軟件測試】Postman中變量的使用

Postman中可設置的變量類型有全局變量,環境變量,集合變量,數據變量及局部變量。區別則是各變量作用域不同,全局變量適用于所有集合,環境變量適用于當前所選環境(所有集合中均可使用不同環境變量&#xff09…

【CSP試題回顧】202309-2-坐標變換(其二)

CSP-202309-2-坐標變換(其二) 關鍵點總結 1.輸入輸出的同步關閉,以加快I/O操作的速度 這一點還是很重要的,本題代碼如果不進行輸入輸出的同步關閉會時間超限。 ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);2.…

職場中的祖傳代碼處理建議

程序員是如何看待“祖傳代碼”的? 祖傳代碼的由來 在實際的程序員工作中,祖傳代碼是常見的。因為真正的互聯網職場生活中,業務變動調整頻繁,每到一個新的業務線,第一件事就是熟悉現有工程代碼,看舊文檔等…

K8S中POD的控制器

一、Pod控制器及其功用 Pod控制器,又稱之為工作負載(workload),是用于實現管理pod的中間層,確保pod資源符合預期的狀態,pod的資源出現故障時,會嘗試進行重啟,當根據重啟策略無效&am…

Linux基礎命令[9]-wc

文章目錄 1. wc 命令說明2. wc 命令語法3. wc 命令示例3.1 不加參數3.2 -c(統計字節數)3.3 -m(統計字符數)3.4 -l(統計行數)3.5 -L(最長一行的長度)3.6 -w(統計單詞數&am…

Arcgis實現點位空間位置從上到下從左到右排序

效果 背景 工作項目中經常會遇到需要對網格進行編號,而編號是有一定原則的,比如空間位置從上到下從左到右,或者其它原則,那么都可以通過下面的方式來實現 1、準備數據 點shp文件,查看初始FID字段標注,目…

transformer--transformer模型構建和測試

前面幾節進行了各種組件的學習和編碼,本節將組件組成transformer,并對其進行測試 EncoderDecoder 編碼器解碼器構建 使用EnconderDecoder實現編碼器-解碼器結構 # 使用EncoderDeconder類實現編碼器和解碼器class EncoderDecoder(nn.Module):def __ini…

飛書文檔批量導出

背景需求 最近所參與的項目即將結項,需要將飛書中的產品需求文檔(PRD)交付給甲方,由于文檔較多,大概有兩百多個,一個一個的下載導出,太麻煩了(PS:本人比較懶)…

ROS create_wall_timer/create_timer函數區別

在ROS(Robot Operating System)中,create_wall_timer 和 create_timer 是用于創建定時器的兩個不同的函數,它們在使用上有一些區別: Clock Type: create_wall_timer: 創建的定時器是基于Wall clock的,這意…

軟考筆記--結構化分析方法

結構化分析(SA)方法的基本思想是自定向下,逐層分解,把一個大問題分解成若干個小問題,每一個小問題再分解成若干個更小的問題。經過逐層分解,每個最低層的問題都是足夠簡單、容易解決的。 SA方法分析模型的…

78. 子集(力扣LeetCode)

文章目錄 78. 子集題目描述回溯算法 78. 子集 題目描述 給你一個整數數組 nums ,數組中的元素 互不相同 。返回該數組所有可能的子集(冪集)。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例 1: 輸入&#xff…

selenium高亮元素

def set_high_light_elment(self, element): """高亮web元素。 Args: element: WebElement:web元素 """ element_styleelement.get_attribute(style) self.mark_dom_text(element_s…

【MySQL】表的約束——空屬性、默認值、列描述、zerofill、主鍵、自增長、唯一鍵、外鍵

文章目錄 MySQL表的約束1. 空屬性2. 默認值3. 列描述4. zerofill5. 主鍵6. 自增長7. 唯一鍵8. 外鍵 MySQL 表的約束 MySQL中的表的約束是一種規則,用于限制或保護表中數據的完整性和合法性。約束可以確保數據在插入、更新或刪除時滿足特定的條件,從而維護…

MySQL相關問題

MySQL相關問題 一、MySQL支持哪些存儲引擎?二、MySQL是如何執行一條SQL的?三、MySQL數據庫InnoDB存儲引擎是如何工作的?四、如果要對數據庫進行優化,該怎么優化?五、MySQL如何定位慢查詢?六、如何分析MySQL…

揭秘App訪問量背后的秘密:數據統計與分析

在移動互聯網時代,App已成為人們日常生活的重要組成部分。對于App運營者來說,了解用戶的訪問量、行為習慣等數據至關重要。本文將深入探討如何精準統計App訪問量,為運營者提供有價值的數據支持。 一、App訪問量統計的重要性 訪問量是衡量A…

計算機專業必看的十部電影

計算機專業必看的十部電影 1. 人工智能2. 黑客帝國3. 盜夢空間4. 社交網絡5. Her6. 模仿游戲7. 斯諾登8. 頭號玩家9. 暗網10. 網絡迷蹤 計算機專業必看的十部電影,就像一場精彩盛宴! 《黑客帝國》讓你穿越虛擬世界,感受高科技的魅力《模仿游戲…

公網IP怎么獲取?

公網IP是網絡中設備的唯一標識符,用于在Internet上進行通信和定位。對于普通用戶來說,了解如何獲取自己的公網IP是很有必要的,本文將介紹幾種獲取公網IP的方法。 方法一:通過路由器查詢 大多數家庭和辦公室使用的路由器都會有一個…

深入解析Mybatis-Plus框架:簡化Java持久層開發(七)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 簡介 本章節介紹如何通過Mybatis-Plus刪除數據庫中的數據。 本章節不需要前置準備,繼續使用之前的測試類,數據庫表進行操作。 &#x1f4…

一文詳解mysql 的鎖

MySQL鎖是用于管理數據庫中的并發操作的一種機制,它可以確保數據的一致性和完整性。 按范圍劃分:包括全局鎖、表級鎖、頁級鎖和行級鎖。 按類型劃分:包括間隙鎖、臨鍵鎖和記錄鎖。 按級別劃分:包括共享鎖(S鎖&#xff…

如何在Windows輕量應用服務器上安裝和配置SSH?

如何在Windows輕量應用服務器上安裝和配置SSH? 檢查OpenSSH的可用性:首先,需要以管理員身份打開PowerShell并運行命令Get-WindowsCapability - Online | Where-Object Name - like OpenSSH*來檢查OpenSSH服務是否可用。如果服務未啟動或不可…