很久沒寫文章,一直在看別人的部落格,今天也寫篇,一則回報各位網友的知識恩賜,二則也為 了提高自己。
聲明:由於本人知識有限,如有紕漏,直接指正,以免誤導各位!
重載:函數名字一樣,傳回型別和參數可以不一樣,編譯器連結時,會加上參數類型檢查(c沒有函數參數類型檢查,所以C 沒有重載)
覆蓋:出現於類的繼承中,基類的函數不起作用,注意是通過基類的指標或是引用來訪問衍生類別(虛函數的重要特性,多態的體現,RTTI技術)
隱藏:出現於函數重載中,非虛函數可出現此情況。
還是代碼驗證吧,上代碼:
class firstBase
{
public:
virtual void fun1(){cout<<"Base::fun1"<<endl;}
void fun2(){cout<<"Base::fun2"<<endl;}
//void fun3{cout<<"Base::fun3"<<endl;}
};
class DrivedFromBase:public firstBase
{
public :
virtual void fun1(){cout<<"DrivedFromBase::fun1"<<endl;}
void fun2(){cout<<"DrivedFromBase::fun2"<<endl;}
void fun2(int x){cout<<"DrivedFromBase::fun2"<<x<<endl;}
void fun3(){cout<<"DrivedFromBase::fun3"<<endl;}
};
class secondBase
{public:
//void fun1(){cout<<"secondBase::fun1"<<endl;}
//void fun2{cout<<"secondBase::fun2"<<endl;}
void fun3(){cout<<"secondBase::fun3"<<endl;}
};
class DerivedFromSecondAndFirstBase:public DrivedFromBase,public secondBase
{
public:
void g(){cout<<"DerivedFromSecondAndFirstBase::fun1"<<endl;}
void h(){cout<<"DerivedFromSecondAndFirstBase::fun2"<<endl;}
//void fun3{cout<<"DerivedFromSecondAndFirstBase::fun3"<<endl;}
};
繼承關係為:
firstBase->DrivedFromBase->
DerivedFromSecondAndFirstBase.
secondBase ->
int main()
{
//二義性問題,非重載
DerivedFromSecondAndFirstBase* p=new DerivedFromSecondAndFirstBase();
// p->fun3();//此句會報錯,可能會誤認為是函數重載,但是fun3分屬於不同的類,因此無法重載,會產生二義性
//覆蓋
DrivedFromBase* db=new DrivedFromBase();
db->fun1(); //通過虛函數覆蓋基類的fun1
//隱藏
db->fun2(2);
firstBase *fp=db;
fp->fun2();//隱藏通過指標的變換是可以訪問到的,而隱藏不能
//沒法調用
//fp->fun3();//如果一個函數不是虛函數,沒法通過基類的指標訪問不是基類的部分,如fun3。
return 0;
}
當然,這部分還是很複雜,暫時沒法從底層解釋這種現象。
運行結果: