類的繼承 正確的使用多重繼承

2021-08-20 09:25:51 字數 1149 閱讀 7344

本文參照於狄泰軟體學院,唐佐林老師的——《c++深度剖析教程》

之前我們發現了多重繼承的三個問題。現在總結一下:

1. 多重繼承得到的物件可能擁有「不同的位址!」(無解決方案)

2. 多重繼承可能產生冗餘的成員(虛繼承解決,但不實用)

3. 多重繼承可能產生多個虛函式表(c++強制型別轉換解決)

在工程開發,我們盡量不要使用直接多重繼承,而是用「單繼承某個類」+「實現(多個)介面」的方式。

1. 先繼承自乙個父類,然後實現多個介面

2. 父類中提供equal()成員函式

3. equal()成員函式用於判斷指標是否指向當前物件

4. 與多重繼承相關的強制型別轉換用dynamic_cast完成。

示例**:正確的多重繼承方式

#include 

#include

using

namespace

std;

class base

int geti()

bool equal(base* obj)

};class inte***ce1

;class inte***ce2

;class derived : public base, public inte***ce1, public inte***ce2

void add(int i)

void minus(int i)

void multiply(int i)

void divide(int i)

}};int main()

輸出結果

p->geti() = 100

p->geti() = 40

pint1 == p : 1

pint2 == p : 1

分析:

1. equal()函式是工程中防止指標錯誤指向多重繼承產生的多個虛函式表的情況。

2. 實際上,強制型別轉換是一種比較好解決多重繼承中不同物件具有不同位址的情況。

3. 多介面實際上就是純虛函式,也就是說類中的成員函式均為虛函式,這樣就解決了成員冗餘的問題。

類的多重繼承

程式頭部注釋開始 程式的版權和版本宣告部分 檔名稱 作 者 張傳新 完成日期 2012 年 05 月 08 日 版 本 號 1.0 對任務及求解方法的描述部分 輸入描述 問題描述 程式輸出 程式頭部的注釋結束 include includeusing namespace std class teac...

類的多重繼承

類的多重繼承 引入 通常乙個事物會同時具有多種基類的屬性,如乙個老師同時是職員也是一位父親,這個時候就會使用多重繼承來展示事物的本質屬性 1 形式 class a 繼承方式 b,繼承方式 c 注 以逗號在多個基類間產生分隔 2 建構函式 同樣是在派生類建構函式中利用函式總表初始化各個基類,先呼叫基類...

類的繼承 被遺棄的多重繼承

本文參照於狄泰軟體學院,唐佐林老師的 c 深度剖析教程 關聯知識 virtual虛函式,繼承 問題 c 中是否允許乙個類繼承自多個父類?如果可以,那麼會出現什麼問題呢?如果不可以,為什麼?我們在單繼承的語法基礎上,再繼承兩個父類,試試編譯是否能通過。class derived public base...