成員函數(shù)被重載的特征: //////////////////基類中
(1)相同的范圍(在同一個(gè)類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual關(guān)鍵字可有可無(wú)。
覆蓋是指派生類函數(shù)覆蓋基類函數(shù),特征是: /////////////基類與子類的關(guān)系
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)相同;
(4)基類函數(shù)必須有virtual關(guān)鍵字。
“隱藏”是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),規(guī)則如下: ////////子類中
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類的函數(shù)將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒(méi)有virtual關(guān)鍵字。此時(shí),基類的函數(shù)被隱藏(注意別與覆蓋混淆)。
#include
class B {
public:
void mf(){cout<<"1 ";};
};
class D: public B {
public:
void mf(){cout<<"2 ";};
};
main(){
D x;
B *pB = &x;
pB->mf();
D *pD = &x;
pD->mf();
//B bb;
// bb.mf();
}
兩種情況下調(diào)用的都是對(duì)象x的成員函數(shù)mf,因?yàn)閮煞N情況下都是相同的函數(shù)和相同的對(duì)象,所以行為會(huì)相同,對(duì)嗎?
對(duì),會(huì)相同。但,也許不會(huì)相同。特別是,如果mf是非虛函數(shù)而D又定義了自己的mf版本,行為就不會(huì)相同.
1)當(dāng)類B中有虛函數(shù)mf()時(shí),類D中沒(méi)有重寫此函數(shù)時(shí),結(jié)果為:1 1。 一般的繼承
2)當(dāng)類B中有虛函數(shù)mf()時(shí),類D中重寫此函數(shù)時(shí),結(jié)果為:2 2。 派生類函數(shù)覆蓋基類函數(shù)
3)當(dāng)類B中有非虛函數(shù)mf()時(shí),類D中沒(méi)有重寫此函數(shù)時(shí),結(jié)果為:1 1。 一般的繼承
4)當(dāng)類B中有非虛函數(shù)mf()時(shí),類D中重寫此函數(shù)時(shí),結(jié)果為:1 2。 類D中的函數(shù)隱藏了從基類B中繼承下來(lái)的函數(shù)
5)當(dāng)類B中有虛或非虛函數(shù)mf()時(shí),類D中有與此函數(shù)同名但時(shí)參數(shù)不同的函數(shù)時(shí),從基類繼承而來(lái)的函數(shù)也被隱藏!
------------------------------------------------------------------------------------------
多重繼承的成員調(diào)用:
cbase
CBase1:public CBase
CBase2:public CBase
CDervied:public CBase1,CBase2
1)當(dāng)cbase1與cbase2不是虛繼承的時(shí):dervied不能訪問(wèn)基類繼承而來(lái)(即共有的)的任何成員,不能識(shí)別。
2)當(dāng)cbase1與cbase2是虛繼承的時(shí),dervied可以訪問(wèn)cbase中沒(méi)有1和2重新定義的成員,也能訪問(wèn)只被1或只被2重新定義的成員,這是調(diào)用1或2中的成員,當(dāng)dervied中有重寫時(shí),調(diào)用derived中重新定義的成員。(共有)
:保證我們?cè)诓豢紤]繼承而來(lái)的隱藏成員時(shí),能夠識(shí)別該調(diào)用那個(gè)類中的!則編譯器也能識(shí)別!
3)
在調(diào)用變量的時(shí)候,要指出時(shí)屬于那個(gè)類。