子類如果重新定義了父類的non-virtual函數則不會有多態效果。
為方便描述,這里的方法和繼承方式都用public。至於原因嘛,你懂的!
1:子類直接繼承父類方法
class BaseOption { public: void Function(); }; void BaseOption::Function() { cout<<"BaseOption::Function()"<<endl; } class SubOption : public BaseOption { }; int _tmain(int argc, _TCHAR* argv[]) { SubOption obj; BaseOption *pBase = &obj;
SubOption *pSub = &obj;
pBase->Function();
pSub->Function();
}
輸出:
"BaseOption::Function()"
"BaseOption::Function()"
這里使用BaseOption 和SubOption 調用Function都能調進BaseOption::Function();
2:為了實現多態效果,把父類Function()改為virtual,在子類中重新實現
class BaseOption { public: virtual void Function(); }; void BaseOption::Function() { cout<<"BaseOption::Function()"<<endl; } class SubOption : public BaseOption { public: void Function(); }; void SubOption::Function() { cout<<"SubOption::Function()"<<endl; } int _tmain(int argc, _TCHAR* argv[]) { SubOption obj; BaseOption *pBase = &obj;
SubOption *pSub = &obj;
pBase->Function();
pSub->Function();
}
這就是我們常說的多態。
輸出:
"SubOption::Function()"
"SubOption::Function()"
3:子類直接重新定義父類non-virtual方法,這背時的做法,在這種情況下就沒有了多態屬性,至於這種設計方法的弊端,沒得說。
class BaseOption { public: void Function(); }; void BaseOption::Function() { cout<<"BaseOption::Function()"<<endl; } class SubOption : public BaseOption { public: void Function(); }; void SubOption::Function() { cout<<"SubOption::Function()"<<endl; } int _tmain(int argc, _TCHAR* argv[]) { SubOption obj; BaseOption *pBase = &obj; SubOption *pSub = &obj; pBase->Function(); pSub->Function(); }
輸出:
BaseOption::Function()
SubOption::Function()
雖然實例對象時SubOption obj,但在調用時候 由BaseOption指針pBase會調進BaseOption中,這也是哦,SubOption is-a BaseOption .