多態(tài)是一種泛型編程的思想,虛函數是其實現的手段(利用父類的指針指向子類的空間)。好了 , 開始正文->
吳中ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
來一段基本代碼:
#includeusing namespace std; class CPeople { public: virtual void goHome() { cout << " Go Home" << endl; } }; class Aonaufly : public CPeople { void goHome() { cout << " Go Wuhan" << endl; } }; int main() { CPeople * people_1 = new Aonaufly; people_1->goHome(); delete people_1; return 0; }
運行結果:
解析 :
① 虛函數的關鍵字是 : virtual (定義格式 : virtual void goHome())
② 子類中也有一個goHome函數,因為在父類中goHome函數是個虛函數。所以子類中的goHome 與 父類中的goHome形成了重寫。(虛函數形成重寫 , 普通函數形成覆蓋)
③ CPeople * people_1 = new Aonaufly; 即用 利用父類的指針指向子類的空間。(不能申明為棧 , 因為棧區(qū)隊形沒有指針概念)這種形式在C# / Java當中也很常見
④ 實際上在子類中的virtual可以省略不寫,編譯會自動加上
如果,在子類中不重寫虛函數 :
#includeusing namespace std; class CPeople { public: virtual void goHome() { cout << " Go Home" << endl; } }; class Aonaufly : public CPeople { }; int main() { CPeople * people_1 = new Aonaufly; people_1->goHome(); delete people_1; return 0; }
結果:
解析:
① 因為子類沒有重寫父類虛函數goHome,所以調用父類的goHome
純虛函數 -> 沒有實現的函數
#includeusing namespace std; class CPeople { public: virtual void goHome() = 0; }; class Aonaufly : public CPeople { virtual void goHome() { cout << " Go Wuhan" << endl; } }; int main() { CPeople * people_1 = new Aonaufly; people_1->goHome(); delete people_1; return 0; }
結果:
解析:
① 純虛函數 virtual void goHome() = 0 。一個父類中都是純虛函數,這個類就是接口類 ; 如果這個父類不全是純函數那這個父類就是抽象類。
② 有純虛函數的類 , 不能被實例化 。只能通過繼承 , 在子類中實現(必須在子類中重寫)
重點補充:
① 重寫虛函數 , 函數名稱 / 函數參數列表 / 函數返回值類型必須是一樣(絕大部分情況 )
② 特殊情況:
#includeusing namespace std; class CPeople { public: virtual CPeople& goHome() { cout << " Go Home" << endl; return (*this); } }; class Aonaufly : public CPeople { virtual Aonaufly& goHome() { cout << " Go Wuhan" << endl; return (*this); } }; int main() { CPeople * people_1 = new Aonaufly; people_1->goHome(); delete people_1; return 0; }
結果:
這是一個特殊的情況返回值不一樣也會構成重寫 , 這個情況叫協(xié)變。
虛析構
為了時子類,父類中的機構函數都被調用,需要使用虛析構(不然 , 只會調用父類的的 )
#includeusing namespace std; class CPeople { public: virtual CPeople& goHome() { cout << " Go Home" << endl; return (*this); } virtual ~CPeople() { cout << "Cpeople" << endl; } }; class Aonaufly : public CPeople { virtual Aonaufly& goHome() { cout << " Go Wuhan" << endl; return (*this); } ~Aonaufly() { cout << "Aonaufly" << endl; } }; int main() { CPeople * people_1 = new Aonaufly; //people_1->goHome(); delete people_1; return 0; }
結果:
關于虛繼承
存在多繼承的時候一定要使用虛繼承
B,C繼承于A 。 D繼承B和C。若A與一個參數a,使用D.a就會造成歧義(從B,C繼承了2個a)。那么B,C都要使用虛繼承
class B : virtual public A
虛繼承 只是繼承使用權(相當于指針),并不復制A中的a