多繼承: 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...