不如換種做法?
總結多重繼承指的是某個類同時繼承了兩個或以上的其他類。那麼多重繼承存在著什麼問題呢?
class
machine
machine()
};class
printer
:public machine};
class
scanner
:public machine};
class
printerscanner
:public printer,
public scanner};
intmain()
執行**,輸出結果:
machine
machine
我們可以看到machine
的建構函式被呼叫了兩次。其實這也很好理解,因為printerscanner
同時繼承了printer
和scanner
。而printer
和scanner
又同時單一繼承了machine
,自然就會構造出兩個machine
子物件。雖然問題不大,但重複的子物件略顯多餘,有沒有辦法可以讓最printer
和scanner
"共享"乙個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基...