C++中的多態性分為編譯時多態性和運行時多態性,編譯時多態通過函數重載和模板體現,運行多態通過虛函數體現
編譯、連接,成為可執行文件的過程,是把可執行代碼聯編在一起的過程。在運行之前就完成的聯編成為靜態聯編;運行時才完成的聯編稱為動態聯編
靜態聯編較為簡單,不予贅述。
動態聯編
為了達到動態聯編獲得運行時多態效果,通常都是用指向基類的指針來調用派生類的虛函數
定義為指向基類的指針,可以作為派生類的指針指向派生類對象,可以訪問從基類繼承下來的各個派生類對象
class Base{ public: void who(){ cout<<"Base"<<endl;}}; class Derived1 : public Base{ public: void who(){ cout<<"Derived1"<<endl;}}; class Derived2 : public Base{ public: void who(){ cout<<"Derived2"<<endl;}}; int main(){ Base base_obj, *p; Derived1 one_obj; Derived2 two_obj; p = &base_obj; p->who(); //輸出Base,改過之后Base p = &one_obj; p->who(); //輸出Base,改過之后Derived1 p = &two_obj; p->who(); //輸出Base,改過之后Derived2 return 0; }
將基類改為virtual void who(){ cout<<"Base"<<endl;}
一個類的實例也被認為是其基類的實例
純虛函數和抽象類
純虛函數:是在基類中聲明的虛函數,但沒有具體的函數定義體,具體定義在各個派生類中。一般格式:
virtual 函數原型 = 0;
包含虛函數的類稱為抽象類,例如:
class CClosedFigure{ public: virtual void Draw() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; };
抽象類沒有完整的實現,無法實例化,但是可以創建指向抽象類的指針。
CClosedFigure *p; //是正確的