C 為什麼不要多重繼承

2021-10-12 00:01:01 字數 2684 閱讀 4332

不如換種做法?

總結多重繼承指的是某個類同時繼承了兩個或以上的其他類。那麼多重繼承存在著什麼問題呢?

class

machine

machine()

};class

printer

:public machine};

class

scanner

:public machine};

class

printerscanner

:public printer,

public scanner};

intmain()

執行**,輸出結果:

machine

machine

我們可以看到machine的建構函式被呼叫了兩次。其實這也很好理解,因為printerscanner同時繼承了printerscanner。而printerscanner又同時單一繼承了machine,自然就會構造出兩個machine子物件。雖然問題不大,但重複的子物件略顯多餘,有沒有辦法可以讓最printerscanner"共享"乙個machine子物件呢?有。

在宣告繼承的時候加上virtual關鍵字,即虛擬繼承。

class

machine

;class

printer

:public

virtual machine};

class

scanner

:public

virtual machine};

class

printerscanner

:public printer,

public scanner};

intmain()

執行**:

machine
這次machine的建構函式只被呼叫了一次。

引入虛擬基類解決了重複子物件問題。但是不是多重繼承就不會衍生出其他問題?繼承意味著,當乙個基類的結構發生變化的時候,繼承這個類的其他類也會受到影響。如果我們給machine這個類加入乙個虛函式,看看其他類的反應如何。

class

machine

virtual

void

run()=

0;};

class

printer

:public machine

void

run(

) override ;}

;class

scanner

:public machine

void

run(

) override ;}

;class

printerscanner

:public printer,

public scanner};

intmain()

通過ps物件呼叫run()函式的時候,編譯器無法得知我們究竟想呼叫的是來自 printer 的run()函式還是來自 scanner 的run()函式。當然我們還是可以通過顯示呼叫run()函式來告知編譯器我們的行為。

printerscanner ps;

ps.::printer::

run();

ps.::scanner::

run(

);

無論是多重繼承抑或虛擬繼承,它們自身都有缺陷,在這種情況下組合是不是比繼承更加合適?

class

material

;class

machine

virtual

void

run(material material)=0

;};class

printer

:public machine

void

run(material material) override ;}

;class

scanner

:public machine

void

run(material material) override ;}

;class

printerscanner

void

scanmaterial

(material material)

private

: printer printer;

scanner scanner;

};

大多數情況下,我們往往是不需要多重繼承的,因為它並不存在著明顯的優勢。而且還會為程式和**的設計帶來很多負面效果。除非只有多重繼承才能解決問題的時候才用多重繼承,其餘情況一律避免使用。

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