C 多重繼承

2021-07-30 09:29:25 字數 3246 閱讀 2684

一,c++多重繼承

mi描述的是有多個直接基類的類。與單繼承一樣公有多繼承表示也是is-a關係。

class worker;

class singer : public worker;

class waiter : public worker;

class singingwaiter : public singer, public waiter;

二,多繼承的優點與缺點a,優點:容易實現多個介面。

b,缺點:比較複雜,會產生很多問題。

三,使用多繼承帶來的問題1 --從兩個或更多相關基類那裡繼承同乙個類的多個例項

1,從兩個或更多相關基類那裡繼承同乙個類的多個例項

class singingwaiter : public singer, public waiter
因為singer與waiter都繼承了乙個worker元件,因此singingwaiter將包含兩個worker元件。此時,如果將派生類物件的位址賦給基類指標,將出現二義性。

singingwaiter obj;

worker *p = &obj;

上面的這種賦值將把指標設定為派生類物件中的基類物件的位址,但obj物件中包含兩個worker物件,有兩個位址可供選擇,所以應使用型別轉換來指定物件。

singingwaiter obj;

worker *p1 = (singer *)&obj;

worker *p2 = (waiter *)&obj;

2, 使用虛基類解決上面的問題

c++引入多重繼承的同時引入虛基類,虛基類使得從多個類(它們的基類相同)派生出的類的物件只繼承乙個基類物件。例如,通過在類宣告中使用virtual關鍵字,可以使worker被用作singer與waiter的虛基類(virtual與public的次序無關緊要)。

class singer : virtual public worker;

class waiter : virtual public worker;

class singingwaiter : public singer, public waiter;

現在,singingwaiter物件將包含worker物件的乙個副本。

3,新的建構函式規則

class a

};class b : public a

};

建立乙個b類物件時,b類的建構函式只能呼叫a類的建構函式,b類的建構函式使用值m,並將值n傳遞給a類的建構函式。

如果worker是虛基類,則這種自動資訊傳遞將不起作用。例如,對於下面的建構函式:

singingwaiter(worker &wk, int p, int v):waiter(wk, p), singer(wk, v){}
存在的問題是,自動資訊傳遞時,將通過兩條不同的途徑(waiter與singer)將wk傳遞給worker物件。為了避免這種衝突,c++在基類是虛的時,禁止資訊通過中間類自動傳遞給基類。因此上述建構函式將初始化panache與voice,但wk引數中的資訊將不會傳遞給子物件waiter。然而,編譯器必須在構造派生類物件之前構造基類物件元件。在上述情況下,編譯器將使用worker的預設建構函式。

如果不希望使用預設建構函式來構造虛基類物件,則需要顯示呼叫所需的基類建構函式。因此,建構函式應該是這樣的。

singingwaiter(worker &wk, int p, int v):worker(wk), waiter(wk, p), singer(wk, v){}
上面的**顯示呼叫worker類的建構函式,這種做法是合法的,對於虛基類。但是對於非基類,則是非法的。如果是非基類,在singingwaiter中只能呼叫waiter與singer的建構函式。

四,使用多繼承帶來的問題2 -- 函式呼叫的二義性

1,多繼承導致的函式呼叫二義性

例如,singingwaiter類可能從singer與waiter類**繼承了兩個不同的show()函式。

singingwaiter obj;

obj.show();

對於單繼承,如果沒有重新定義show函式,則將使用最近祖先中的定義。而在多重繼承中,每個直接祖先都有乙個show函式,這將導致函式呼叫二義性。

2,使用作用域解析運算子來澄清程式設計者的意圖

singingwaiter obj;

obj.singer::show();

obj.waiter::show();

更好的方法是在singingwaiter中重新定義show,並指出要使用哪個show。

void singingwaiter::show()

3,對於單繼承,讓派生類方法呼叫基類方法是可以的,然而這種遞增方法對singingwaiter無效。

下面的做法忽略了waiter元件。

void singingwaiter::show()
通過同時呼叫waiter版本的show函式來彌補。

void singingwaiter::show()
然而,這樣做將顯示worker類物件資訊兩次,因為singer::show()與waiter::show()都呼叫了worker::show()。

要解決上面的問題,可以使用模組化方法,而不是遞增方式,即提供乙個只顯示worker元件的方法,乙個只顯示singer元件的方法,乙個只顯示waiter元件的方法。

void worker::data()

void waiter::data()

void singer::data()

void singingwaiter::data()

void singingwaiter::show()

多重繼承 C 中的多重繼承

多重繼承是c 的一項功能,其中乙個類可以從多個類繼承。繼承類的建構函式以它們繼承的相同順序被呼叫。例如,在以下程式中,在a的建構函式之前呼叫b的建構函式。include using namespace std class a class b class c public b,public a not...

c 多重繼承

其實想寫這篇文章,是因為突然在整理論壇上的帖子的時候,突然發現乙個人問我如何才能在c 中實現多重繼承,當時我答的很隱晦,因此這裡我想補充說明一下.首先,我要說明一下,c 中是沒有類的多重繼承這個概念.要使用多重繼承必須要通過介面inte ce來完成.可是大家都知道inte ce實際上就是乙個虛函式列...

C 多重繼承

c 中的多繼承可看做是單繼承的擴充套件,就是乙個派生類對應多個基類。以下是一段多重繼承的 class a class b class c public a,public b 以上的程式中,派生類c繼承了基類a b。派生類c中,公有繼承了a,所以c的共有成員中有a中的兩個共有成員函式,而私有繼承的b基...