effective c++條款34:區分介面繼承和實現繼承
阿新 • • 發佈:2018-11-11
1. 純虛擬函式也可以有具體實現
#include <iostream> using namespace std; class Airplane { public: virtual void fly(const char *)const = 0; }; void Airplane::fly(const char *Goal) const { cout << "Model goto " << Goal << endl; } class ModelA : public Airplane { public: virtual void fly(const char *goal)const { Airplane::fly(goal); } }; class ModelB : public Airplane { public: virtual void fly(const char *goal)const { //B的自定義實現 } }; int main() { Airplane *A = new ModelA; A->fly("China"); A->Airplane::fly("China"); return 0; }
我們都知道,非純虛擬函式的作用是為了讓子類繼承該介面並且可以選擇其父類中的預設實現(繼承)和子類的自定義實現(覆蓋),有些時候,對於某些需要實現覆蓋的子類我們可能忘記了覆蓋,而直接繼承了父類的預設實現。為了防止遺忘,我們可以強制子類必須重新實現,如果想要預設實現只需呼叫父類中的預設函式即可。
我們可以呼叫父類中的純虛擬函式,只需要加上作用域即可,利用這一特性,可以使純虛擬函式成為預設函式,在父類中新增其具體實現。如果子類只需要該函式的預設實現方式,可以直接呼叫父類中的純虛擬函式。