4 虛函數用法
阿新 • • 發佈:2017-07-24
而是 綁定 new ace 輸出 是否 聲明 virtual over
分析下列程序:
#include<iostream> #include<string.h> using namespace std; class Base{ public: Base() { echo(); } virtual void echo() { printf("Base"); } }; class Derived : public Base { public: Derived() { echo(); }virtual void echo() { printf("Derived"); } }; int main() { Base *base=new Derived(); base->echo(); return 0; }
程序輸出: Base 、Derived、Derived
分析:
首先聲明Base類型的指針指向實際類型為Derived的對象,先調用基類構造函數,再調用派生類構造函數。輸出Base, Derived.
base->echo(); 指針是base類型,但是因為有關鍵詞 virtual,所以不是隱藏而是重寫.調用的是Derived的方法,輸出Derived。
1.重載:重載從overload翻譯過來,是指同一可訪問區內被聲明的幾個具有不同參數列(參數的類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。
2.隱藏:隱藏是指派生類的函數屏蔽了與其同名的基類函數。註意只要同名函數,不管參數列表是否相同,基類函數都會被隱藏。
3.重寫:重寫翻譯自override,也翻譯成覆蓋(更好一點),是指派生類中存在重新定義的函數。其函數名,參數列表,返回值類型,所有都必須同基類中被重寫的函數一致。只有函數體不同(花括號內),派生類調用時會調用派生類的重寫函數,不會調用被重寫函數。重寫的基類中被重寫的函數必須有virtual修飾。
註意:父類構造函數裏不能調用虛函數,因為虛函數是運行時調用確定的,父類對象會調用子類函數,這樣會出問題。
動態綁定只有在通過指針或引用調用虛函數時才會發生。
虛函數在構造函數裏面與普通函數一樣,失去了多態性,但是一般在構造函數裏面不調用虛函數。
4 虛函數用法