C 53 被遺棄的多重繼承 (上)

2021-09-13 02:24:57 字數 2717 閱讀 5776

問題:

c++ 中是否允許乙個類繼承自多個父類?

class derived : public base a, public base b, public base c

#include using namespace std;

class basea

int geta()

};class baseb

int getb()

};class derived : public basea, public baseb

int getc()

void print()

};int main()

else

cout << "pa = " << pa << endl; // 注意這裡!!!

cout << "pb = " << pb << endl;

cout << "paa = " << paa << endl;

cout << "pbb = " << pbb << endl;

return 0;

}

輸出:

sizeof(derived) = 12 ; 子類擁有所有父類成員變數

ma = 1,mb = 2,mc = 3 ; 子類繼承父類所有成員函式

d.geta() = 1

d.getb() = 2

d.getc() = 3

pa->geta() = 1 ; 賦值兼用

pb->getb() = 2

error ; 注意這裡!!!

pa = 0xbfd98c64

pb = 0xbfd98c68

paa = 0xbfd98c64

pbb = 0xbfd98c68

分析:basea* pa = &d;

baseb* pb = &d;

basea、baseb 都為 d 的父類,pa,pb 同時指向乙個物件,為什麼會有不同的位址輸出呢?

通過多重繼承得到的物件可能擁有」不同的位址「!!
解決方案: 無

在實際工程開發中,我們往往會通過判斷兩指標儲存的位址值是否相等判斷兩指標是否指向同一物件。但多繼承與我們平常遵循的原則是違背的。

這將極大的增加開發複雜!!!!

輸出:

name = d.t_1,age = 5

name = d.t_2,age = 6

當多重繼承關係出現閉合時將產生資料冗餘的問題!!!
解決方案: 虛繼承

class people

;class teacher : virtual public pelple

;class student : virtual public people

;class doctor : public teacher, public student

#include #include using namespace std;

class people

void print()

};class teacher : virtual public people

};class student : virtual public people

};class doctor : public teacher, public student

};int main()

輸出:

name = d.t,age = 4

name = d.t,age = 4

name = d.t,age = 4

問題:

當架構設計中需要繼承時,無法確定使用直接繼承還是虛繼承

虛繼承雖然在技術上解決了資料冗餘的問題,但相比單繼承清晰的使用規則來說,極大的增加了開發複雜度,尤其在大型軟體專案中。

53 被遺棄的多重繼承

c 支援編寫多重繼承的 乙個子類可以擁有多個父類,子類擁有所有父類的成員變數,子類繼承所有父類的成員函式,子類物件可以當作任意父類物件使用。多重繼承的本質與單繼承相同。include include using namespace std class basea int geta class bas...

第53課 被遺棄的多重繼承(上)

本文內容來自於對狄泰學院 唐佐林老師 c 深度解析 課程的學習總結 c 中的多重繼承 c 支援編寫 多重繼承 的 乙個子類可以擁有多個父類 子類擁有所有父類 的成員變數 子類繼承 所有父類的 成員變數 子類物件可以當作任意父類物件 使用 多重繼承的語法規則 多重繼承的本質與單繼承相同!多重繼承問題一...

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

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