C++中的多態(tài)性分為編譯時多態(tài)性和運(yùn)行時多態(tài)性勘天,編譯時多態(tài)通過函數(shù)重載和模板體現(xiàn)饰及,運(yùn)行多態(tài)通過虛函數(shù)體現(xiàn)
編譯、連接族沃,成為可執(zhí)行文件的過程频祝,是把可執(zhí)行代碼聯(lián)編在一起的過程泌参。在運(yùn)行之前就完成的聯(lián)編成為靜態(tài)聯(lián)編脆淹;運(yùn)行時才完成的聯(lián)編稱為動態(tài)聯(lián)編
靜態(tài)聯(lián)編較為簡單,不予贅述沽一。
動態(tài)聯(lián)編
為了達(dá)到動態(tài)聯(lián)編獲得運(yùn)行時多態(tài)效果盖溺,通常都是用指向基類的指針來調(diào)用派生類的虛函數(shù)
定義為指向基類的指針,可以作為派生類的指針指向派生類對象铣缠,可以訪問從基類繼承下來的各個派生類對象
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;}
一個類的實例也被認(rèn)為是其基類的實例
純虛函數(shù)和抽象類
純虛函數(shù):是在基類中聲明的虛函數(shù)蝇庭,但沒有具體的函數(shù)定義體醉鳖,具體定義在各個派生類中。一般格式:
virtual 函數(shù)原型 = 0;
包含虛函數(shù)的類稱為抽象類哮内,例如:
class CClosedFigure{ public: virtual void Draw() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; };
抽象類沒有完整的實現(xiàn)盗棵,無法實例化,但是可以創(chuàng)建指向抽象類的指針北发。
CClosedFigure *p; //是正確的