39多繼承和虛基類

2021-09-25 18:07:40 字數 2274 閱讀 5713

多繼承: horse類 + bird類 → pegasus類(飛馬)

多繼承帶來的問題 → 二義性問題: 繼承了兩個以上重名的函式,使得c++不知道該呼叫哪乙個函式

解決方式: 寫上基類名稱

菱形繼承 horse和bird都有共同的基類animal → 導致在建立pegasus類物件時會呼叫兩次animal類,產生兩次繼承。

// 39 多繼承與虛基類

#include

using namespace std;

enum color

;class animal //共同基類

virtual getage()

virtual void

setage

(int age)

private:

int itsage;};

animal:

:animal

(int age)

:itsage

(age)

class horse : virtual public animal

virtual void

whinny()

const

virtual int

getheight()

const

virtual color getcolor()

const

private:

int itsheight;

color itscolor;};

horse:

:horse

(color color,

int height,

int age)

:itscolor

(color)

,itsheight

(height)

,animal

(age)

//animal呼叫但並不被執行

class bird : virtual public animal //虛基類(虛繼承)

virtual void

chirp()

const

//鳥叫

virtual void

fly(

)const

virtual bool getmirgration()

const

virtual color getcolor()

const

private:

bool itsmigration;

color itscolor;};

bird:

:bird

(color color, bool migrates,

int age)

:itscolor

(color)

,itsmigration

(migrates)

,animal

(age)

class pegasus : public horse, public bird //多繼承:繼承了horse又繼承了bird,且不用虛繼承

//覆蓋了基類的

pegasus

(color acolor,

int height, bool migrates,

long numberbelivers,

int age)

; virtual ~

pegasus()

virtual long

getnumberbelivers()

const

private:

long itsnumberbelivers;};

//建構函式,第乙個引數在horse裡,第二個引數在bird裡,第三個引數在自己的類裡

pegasus:

:pegasus

(color acolor,

int height, bool migrates,

long numberbelivers,

int age)

:horse

(acolor, height, age)

,bird

(acolor, migrates, age)

,itsnumberbelivers

(numberbelivers)

,animal

(age)

//要呼叫虛基類,因為horse和bird都不管animal,因此需要pegasus呼叫animal

intmain()

多繼承和虛基類

一.多繼承機制存在哪些問題,怎麼解決這些問題?歧義性 相同名稱的成員在記憶體中同時擁有多個拷貝,當通過派生類物件使用這些成員時,就會產生歧義性。作用域操作符雖然能解決歧義性問題,但並沒有解決多個拷貝的問題。類d 的記憶體布局 使用虛擬機制注意事項 1.若在虛基類中定義了帶引數的建構函式,而沒有定義預...

多繼承與虛基類

c 中的多繼承的二義性問題與虛基類的用法。在c 中類的繼承非常的廣泛,但當乙個類繼承了兩個或兩個以上的類的時候,如果在其繼承的多個基類中存在相同的函式成員,在呼叫該函式時,就會產生不知道呼叫哪個基類的函式,產生二義性。通常通過在呼叫時加上作用域操作符 指明呼叫的基類函式便可解決。這裡再講一種需要用到...

虛繼承和虛基類

虛繼承主要解決在多重繼承中的菱形繼承問題,也就是說 b和c類同時繼承了a類,然後d類繼承了b,c類,那麼d類的虛表就會有重複的函式指標。include using namespace std 虛基類 class person person person string name name name e...