十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
多態(tài)是一種泛型編程的思想,虛函數(shù)是其實(shí)現(xiàn)的手段(利用父類的指針指向子類的空間)。好了 , 開(kāi)始正文->
創(chuàng)新互聯(lián)是一家專業(yè)提供屯留企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為屯留眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。來(lái)一段基本代碼:
#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; }
運(yùn)行結(jié)果:

解析 :
① 虛函數(shù)的關(guān)鍵字是 : virtual (定義格式 : virtual void goHome())
② 子類中也有一個(gè)goHome函數(shù),因?yàn)樵诟割愔術(shù)oHome函數(shù)是個(gè)虛函數(shù)。所以子類中的goHome 與 父類中的goHome形成了重寫(xiě)。(虛函數(shù)形成重寫(xiě) , 普通函數(shù)形成覆蓋)
③ CPeople * people_1 = new Aonaufly; 即用 利用父類的指針指向子類的空間。(不能申明為棧 , 因?yàn)闂^(qū)隊(duì)形沒(méi)有指針概念)這種形式在C# / Java當(dāng)中也很常見(jiàn)
④ 實(shí)際上在子類中的virtual可以省略不寫(xiě),編譯會(huì)自動(dòng)加上

如果,在子類中不重寫(xiě)虛函數(shù) :
#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; }
結(jié)果:

解析:
① 因?yàn)樽宇悰](méi)有重寫(xiě)父類虛函數(shù)goHome,所以調(diào)用父類的goHome
純虛函數(shù) -> 沒(méi)有實(shí)現(xiàn)的函數(shù)
#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; }
結(jié)果:

解析:
① 純虛函數(shù) virtual void goHome() = 0 。一個(gè)父類中都是純虛函數(shù),這個(gè)類就是接口類 ; 如果這個(gè)父類不全是純函數(shù)那這個(gè)父類就是抽象類。
② 有純虛函數(shù)的類 , 不能被實(shí)例化 。只能通過(guò)繼承 , 在子類中實(shí)現(xiàn)(必須在子類中重寫(xiě))
重點(diǎn)補(bǔ)充:
① 重寫(xiě)虛函數(shù) , 函數(shù)名稱 / 函數(shù)參數(shù)列表 / 函數(shù)返回值類型必須是一樣(絕大部分情況 )
② 特殊情況:
#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; }
結(jié)果:

這是一個(gè)特殊的情況返回值不一樣也會(huì)構(gòu)成重寫(xiě) , 這個(gè)情況叫協(xié)變。
虛析構(gòu)
為了時(shí)子類,父類中的機(jī)構(gòu)函數(shù)都被調(diào)用,需要使用虛析構(gòu)(不然 , 只會(huì)調(diào)用父類的的 )
#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; }
結(jié)果:

關(guān)于虛繼承
存在多繼承的時(shí)候一定要使用虛繼承
B,C繼承于A 。 D繼承B和C。若A與一個(gè)參數(shù)a,使用D.a就會(huì)造成歧義(從B,C繼承了2個(gè)a)。那么B,C都要使用虛繼承
class B : virtual public A
虛繼承 只是繼承使用權(quán)(相當(dāng)于指針),并不復(fù)制A中的a
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。