您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關C++中覆蓋和隱藏的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
繼承是面向對象編程的重要特性,在c++中,當父類與子類出現同名函數時,會出現兩種情況:覆寫和隱藏
當子類繼承父類,并且子類中有父類同名函數,那么子類將隱藏父類中所有同名函數,不可以對父類中同名函數直接進行訪問,此時子類調用父類中函數需要用域操作符::
#include<iostream> using namespace std; class A{ public: void fun1(){ cout<<"A::fun1()"<<endl; } void fun1(int){ cout<<"A::fun1(int)"<<endl; } void fun2(){ cout<<"A::fun2()"<<endl; } }; class B:public A{ public: void fun1(){ cout<<"B::fun1()"<<endl; } }; int main(){ B b; b.fun1();//調用子類b的fun1()函數 //b.fun1(3);嘗試調用父類fun1(int)函數會報錯:error:no matching function for call to 'B::fun1(int)' b.A::fun1();//調用父類A的fun1()函數 b.A::fun1(3);//調用父類A的fun1(int)函數 b.fun2();//調用父類A的fun2()函數 return 0; }
b調用fun1()函數,會調用子類b的fun1()函數,而嘗試使用b.fun(3)調用父類的void fun(int)函數時,會報錯,因為父類中的同名函數都被隱藏。此時調用父類中函數的方法是使用域操作符::。
當父類中同名函數擁有virtual修飾符修飾時,此時子類對父類函數進行覆寫
#include<iostream> using namespace std; class A{ public: virtual void fun1(){ cout<<"A::fun1()"<<endl; } void fun1(int){ cout<<"A::fun1(int)"<<endl; } void fun2(){ cout<<"A::fun2()"<<endl; } }; class B:public A{ public: virtual void fun1(){ cout<<"B::fun1()"<<endl; } }; int main(){ B b; b.fun1();//調用子類b的fun1()函數 //b.fun1(3);嘗試調用父類fun1(int)函數會報錯:error:no matching function for call to 'B::fun1(int)' b.A::fun1();//調用父類A的fun1()函數 b.A::fun1(3);//調用父類A的fun1(int)函數 b.fun2();//調用父類A的fun2()函數 return 0; }
可見即使是虛函數覆寫,也會隱藏父類中的所有同名函數。
當子類與父類有同名函數,無論是覆寫還是隱藏的方式,在子類自身進行函數調用時,會調用子類函數而隱藏父類的所有同名函數,要訪問父類函數需要通過域操作符進行訪問。
覆寫與隱藏的區別可以體現在基類指針的使用上,比如以下程序
#include<iostream> using namespace std; class A{ public: void function1(){ cout<<"A::function1"<<endl; } virtual void function2(){ cout<<"A::function2"<<endl; } }; class B:public A{ public: //隱藏基類function1 void function1(){ cout<<"B::function1"<<endl; } }; class C:public A{ public: //覆寫基類function2 virtual void function2(){ cout<<"C::function2"<<endl; } }; int main(){ A *a; B b; C c; a=&b; a->function1(); a=&c; a->function2(); return 0; }
b隱藏基類的同名函數function1(),當基類指針a指向子類b時,調用的是a的function1()函數,而子類c覆寫a的同名函數function2(),當基類a指針指向子類c,調用的是c的function2()函數。
利用覆寫的特點,可以實現c++的多態特性。
隱藏:當父類函數與派生類函數同名,并且父類函數無virtual關鍵字修飾,無論父類與派生類參數個數與類型是否相同,此時派生類函數隱藏父類所有同名函數
覆寫:當父類函數與派生類函數同名,并且參數相同,返回值相同,并且父類函數有virtual關鍵字修飾,此時派生類函數覆寫父類函數
感謝各位的閱讀!關于“C++中覆蓋和隱藏的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。