class CClassBase { public: virtual bool vFunTest(); bool funTest(); }; class CClassExtern : public CClassBase { public: virtual bool vFunTest (); bool funTest(); };
多態的主要思想:基類指針可以指向派生的對象。
CClassExtern *pE = new CClassExtern(); CClassBase* p = pE; pE-> vFunTest (); //調用派生類方法 p-> vFunTest (); //調用派生類方法 pE->funTest(); //調用派生類方法 p->funTest(); //調用基類方法 fun(CClassBase* pTemp) { pTemp-> vFunTest (); //傳入派生類對象時,調用派生類方法;傳入基類對象,調用基類方法 pTemp->funTest();//調用基類方法 }
多態---最常見的用法就是聲明基類的指針,利用該指針指向任意一個子類對象,調用相應的虛函數,可以根據指向的子類的不同而實現不同的方法。如果沒有使用虛函數的話,即沒有利用C++多態性,則利用基類指針調用相應的函數的時候,將總被限制在基類函數本身,而無法調用到子類中被重寫過的函數。
虛函數是在基類中被聲明爲virtual,並在派生類中重新定義的成員函數,可實現成員函數的動態覆蓋(Override)
隱藏---是指派生類的函數屏蔽了與其同名的基類函數。
(規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual
關鍵字,基類的函數將被隱藏(易與重載混淆)。
(2)如果派生類的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual
關鍵字。此時,基類的函數被隱藏(易與重載混淆)。)
重載---則是允許有多個同名的函數,而這些函數的參數列表不同,允許參數個數不同,參數類型不同,或者兩者都不同。編譯器會根據這些函數的參數列表,來實現同名函數調用時的重載問題。