C++基礎——繼承(下)

一、繼承與靜態成員

基類定義了static 靜態成員,則整個繼承體系里面只有一個這樣的成員。無論派生出多少個子

類,都只有一個 static 成員實例 。


class person
{
public:person(const char* name = "lisi"):_name(name){}
public:string _name;// 靜態成員屬性static int count;
};
class worker : public person
{
public:protected:string _job_number = "111";
};
// 靜態成員屬性需要在類外定義
int person::count = 0;void Test2(void)
{person pobj;worker wobj;pobj._name = "wangwu";cout << pobj._name << endl;cout << wobj._name << endl;cout << "wobj.count: " << wobj.count << endl;// 基類更改這個靜態成員pobj.count = 5;cout << "wobj.count: " << wobj.count << endl;cout << "&pobj.count = " << &pobj.count << endl;cout << "&wobj.count = " << &wobj.count << endl;
}

靜態成員屬性需要在類外定義;

上面的_name,基類對象和派生類對象各自私有一份,而對于靜態成員變量?count,派生類繼承的 count 和基類里面的 count 是同一份。

即基類里面的靜態成員,無論有多少個派生類,它們都共享同一個靜態成員。

二、單繼承

單繼承:一個派生類只有一個直接基類,我們稱這個繼承關系為單繼承。

class Person{};
class Worker : public Person{};
class Teacher : public Worker{};

三、多繼承

多繼承:一個派生類有兩個或以上直接基類時稱這個繼承關系為多繼承。

四、菱形繼承

類似以上繼承為菱形繼承。

菱形繼承會產生數據冗余和二義性的問題。在Assistant的對象中Person成員會有兩份。

二義性無法明確知道訪問的是哪一個,需要顯示指定訪問哪個父類的成員可以解決二義性問題,但是數據冗余問題無法解決。

那么該怎么解決呢?

虛擬繼承可以解決菱形繼承的二義性和數據冗余的問題。

五、虛擬繼承

為解決菱形繼承的二義性和數據冗余,我們采用菱形繼承,我們看以下代碼:

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;
}

六、總結

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

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

3.繼承和組合的區別?什么時候用繼承?什么時候用組合?


繼承和組合是面向對象編程中兩種常見的代碼重用機制,它們有不同的使用場景和特點。

繼承:

  • 繼承是一種“is-a”關系,它描述了兩個類之間的一種層次結構,子類繼承了父類的屬性和方法,并且可以添加自己的新屬性和方法。
  • 適合于在現有類的基礎上進行擴展,通過重用現有類的代碼來實現新類的功能。
  • 通常用于描述一種分類或分類的關系,子類是父類的特例,具有更具體的特征或行為。
  • 適用于需要實現代碼的重用和擴展的情況。

組合:

  • 組合是一種“has-a”關系,它描述了兩個類之間的一種包含關系,一個類包含另一個類的實例作為其成員變量。
  • 適合于描述一種包含關系,其中一個類包含另一個類的實例,并且通過這種組合來實現更復雜的功能。
  • 通常用于描述一種組合或擁有關系,其中一個類包含了另一個類的實例作為其一部分。
  • 適用于需要將不同的類組合在一起實現某個功能的情況,而不是通過繼承來實現。

在未來代碼設計中,遵循的設計原則是:低耦合,高內聚。

在選擇繼承還是組合時,可以考慮以下幾點:

  • 代碼重用性:如果需要重用現有類的代碼并擴展其功能,則可以選擇繼承。如果只是需要利用現有類的功能而不需要擴展其功能,則可以選擇組合。
  • 耦合性:繼承會增加類之間的耦合性,子類與父類之間存在較強的依賴關系,而組合可以降低耦合性,類之間的關系更靈活。
  • 設計靈活性:組合比繼承更靈活,因為可以隨時更改組合關系,而不會影響類的結構。繼承則更加靜態,子類的結構受限于父類的定義。

4.如何定義一個無法被繼承的類?

第一種方式C++98,將基類的構造私有化,派生類繼承這個基類,在實例化對象時,需要調用基類的構造,但由于基類的構造已經私有化,故會編譯報錯。

class A
{
public://將基類的構造函數私有化
private:   A(int a = int()):_a(a){cout << "A()" << endl;};
protected:int _a;
};class B : public A
{
protected:int _b;
};

對于 C++11 的做法是:通過關鍵字 final,被final修飾的類無法被繼承,編譯器會強制檢查。

// 用 final 修飾 A類, 此時A類無法被繼承
class A final
{
public:A(int a = int()) :_a(a){cout << "A()" << endl;}
protected:int _a;
};class B : public A
{
protected:int _b;
};

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

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

相關文章

那些年我與c++的叫板(一)--string類自實現

引子&#xff1a;我們學習了c中的string類&#xff0c;那我們能不能像以前數據結構一樣自己實現string類呢&#xff1f;以下是cplusplus下的string類&#xff0c;我們參考參考&#xff01; 廢話不多說&#xff0c;直接代碼實現&#xff1a;&#xff08;注意函數之間的復用&…

Nacos+GateWay 搭建微服務架構

文章目錄 1.當前項目架構分析1.請求多個模塊的方式1.請求renren-fast模塊開發環境生產環境 2.請求sunliving-commodity模塊1.使用環境變量資源路徑的方式2.開發環境 dev.env.js3.生產環境 prod.env.js 3.文件上傳請求 sunliving-service模塊1.請求后端接口&#xff08;開發環境…

當服務實例出現故障時,Nacos如何處理?

當服務實例出現故障時&#xff0c;Nacos的應對策略 在微服務架構日益盛行的今天&#xff0c;服務之間的穩定性與可靠性成為了我們架構師們不得不面對的重要課題。尤其是在面對服務實例出現故障時&#xff0c;如何確保整個系統的穩定運行&#xff0c;成為了我們首要考慮的問題。…

匯聚榮科技:拼多多上架商品后需要做頁面推廣嗎?

在電商平臺上&#xff0c;商品的曝光率和銷量往往成正比。那么&#xff0c;當您在拼多多上架了新品&#xff0c;是不是就意味著坐等訂單呢?答案顯然是否定的。商品一旦上架&#xff0c;接下來需要做的就是通過有效的頁面推廣來增加商品的可見度&#xff0c;吸引潛在買家的注意…

在亞馬遜上賣燈具需要什么認證,亞馬遜燈飾產品需要審核與認證嗎

LED燈具在亞馬遜美國站銷售&#xff0c;需要有UL認證或者UL報告、FCC&#xff0c;如果是帶消毒滅菌的燈&#xff0c;需要做EPA&#xff0c;歐洲站&#xff0c;日本站&#xff0c;認證只需要CE和ROHSR認證。 UL認證&#xff1a;本認證主要針對充電器、移動電源、手機電池、燈具…

Rust的NLL特性:讓生命周期管理更靈活

Rust的NLL特性&#xff1a;讓生命周期管理更靈活 Rust語言以其獨特的內存安全和并發性能受到開發者的青睞。而在Rust中&#xff0c;一個關鍵的概念就是“生命周期”。為了進一步優化生命周期的管理和借用檢查&#xff0c;Rust引入了NLL&#xff08;Non-Lexical Lifetime&#…

html基礎(全)

html簡介 目錄 什么是網頁 什么是 HTML 常用瀏覽器 WebE標準的構成 基本語法概述 第一個HTML頁面 文檔類型聲明標簽 lang 語言種類 字符集 標題標簽 段落和換行標簽 文本格式化標簽 div和span標簽 圖像標簽和路徑 超鏈接標簽 表格的主要作用 表頭單元格標簽 列…

純血鴻蒙APP實戰開發——Web獲取相機拍照圖片案例

介紹 本示例介紹如何在HTML頁面中拉起原生相機進行拍照&#xff0c;并獲取返回的圖片。 效果預覽圖 使用說明 點擊HTML頁面中的選擇文件按鈕&#xff0c;拉起原生相機進行拍照。完成拍照后&#xff0c;將圖片在HTML的img標簽中顯示。 實現思路 添加Web組件&#xff0c;設置…

【SpringBoot】SpringBoot整合jasypt進行重要數據加密

&#x1f4dd;個人主頁&#xff1a;哈__ 期待您的關注 目錄 &#x1f4d5;jasypt簡介 &#x1f525;SpringBoot使用jasypt &#x1f4c2;創建我需要的數據庫文件 &#x1f4d5;引入依賴 &#x1f513;配置數據庫文件&#xff08;先不進行加密&#xff09; &#x1f319;創…

Anaconda安裝-超詳細版(2024)

掃盲&#xff1a;先裝Python還是先裝anaconda? 安裝anaconda即可&#xff0c;不需要單獨裝python anaconda 是一個python的發行版&#xff0c;包括了python和很多常見的軟件庫, 和一個包管理器conda。 一、下載Anaconda 安裝包&#xff08;官網和國內鏡像資源&#xff09; …

【深度學習】SDXL中的Offset Noise,Diffusion with Offset Noise,帶偏移噪聲的擴散

https://www.crosslabs.org//blog/diffusion-with-offset-noise 帶有偏移噪聲的擴散 針對修改后的噪聲進行微調&#xff0c;使得穩定擴散能夠輕松生成非常暗或非常亮的圖像。 作者&#xff1a;尼古拉斯古藤伯格 | 2023年1月30日 馬里奧兄弟使用穩定擴散挖掘隧道。左圖顯示了未…

Springboot+Vue項目-基于Java+MySQL的高校專業實習管理系統(附源碼+演示視頻+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;Java畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計 &…

Linux文件:重定向底層實現原理(輸入重定向、輸出重定向、追加重定向)

Linux文件&#xff1a;重定向底層實現原理&#xff08;輸入重定向、輸出重定向、追加重定向&#xff09; 前言一、文件描述符fd的分配規則二、輸出重定向&#xff08;>&#xff09;三、輸出重定向底層實現原理四、追加重定向&#xff08;>>&#xff09;五、輸入重定向…

關于 vs2019 c++20 規范里的 STL 庫里模板 decay_t<T>

&#xff08;1&#xff09; 這個模板&#xff0c;在庫代碼里非常常見。 decay 英文是“衰弱&#xff0c;消減” 的意思&#xff0c;大概能感覺到就是要簡化模板參數 T 的類型&#xff0c;去掉其上的修飾符。因為常用且復雜&#xff0c;故單獨列出其源碼和注釋。先舉例其應用場景…

LINQ(五) ——使用LINQ進行匿名對象初始化

總目錄 C# 語法總目錄 上一篇&#xff1a;LINQ(四) ——使用LINQ進行對象類型初始化 LINQ 五 ——使用LINQ進行匿名對象初始化 6.2 匿名類型 6.2 匿名類型 可以不用聲明定義一個對象&#xff0c;直接使用new&#xff0c;然后直接賦值即可 string[] names { "Tom",…

動態順序表實現

目錄 1. 順序表的概念 2. 實現的功能 3. 順序表的定義 4.順序表的實現 4.1 seqlist.c 4.2 seqlist.h 4.3 test.c 5. 順序表的優缺點 5.1優點 5.2缺點 1. 順序表的概念 用一段物理地址連續的內存依次存儲數據元素的線性結構 本質就是數組&#xff0c;在數組基礎上要求…

從零手寫實現 tomcat-11-filter 過濾器

創作緣由 平時使用 tomcat 等 web 服務器不可謂不多&#xff0c;但是一直一知半解。 于是想著自己實現一個簡單版本&#xff0c;學習一下 tomcat 的精髓。 系列教程 從零手寫實現 apache Tomcat-01-入門介紹 從零手寫實現 apache Tomcat-02-web.xml 入門詳細介紹 從零手寫…

基于Springboot的學生心理壓力咨詢評判(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的學生心理壓力咨詢評判&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系…

Yalmip使用教程(8)-常見報錯及調試方法

博客中所有內容均來源于自己學習過程中積累的經驗以及對yalmip官方文檔的翻譯&#xff1a;https://yalmip.github.io/tutorials/ 這篇博客將詳細介紹使用yalmip工具箱編程過程中的常見錯誤和相應的解決辦法。 1.optimize的輸出參數 眾所周知&#xff0c;optimize是yalmip用來求…