多態(tài)是一種泛型編程的思想,虛函數(shù)是其實現(xiàn)的手段(利用父類的指針指向子類的空間)。好了 , 開始正文->
創(chuàng)新互聯(lián)是一家專業(yè)提供屯留企業(yè)網(wǎng)站建設,專注與成都做網(wǎng)站、成都網(wǎng)站設計、H5高端網(wǎng)站建設、小程序制作等業(yè)務。10年已為屯留眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。來一段基本代碼:
#include <iostream>
using 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;
}運行結(jié)果:

解析 :
① 虛函數(shù)的關鍵字是 : virtual (定義格式 : virtual void goHome())
② 子類中也有一個goHome函數(shù),因為在父類中g(shù)oHome函數(shù)是個虛函數(shù)。所以子類中的goHome 與 父類中的goHome形成了重寫。(虛函數(shù)形成重寫 , 普通函數(shù)形成覆蓋)
③ CPeople * people_1 = new Aonaufly; 即用 利用父類的指針指向子類的空間。(不能申明為棧 , 因為棧區(qū)隊形沒有指針概念)這種形式在C# / Java當中也很常見
④ 實際上在子類中的virtual可以省略不寫,編譯會自動加上

如果,在子類中不重寫虛函數(shù) :
#include <iostream>
using 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é)果:

解析:
① 因為子類沒有重寫父類虛函數(shù)goHome,所以調(diào)用父類的goHome
純虛函數(shù) -> 沒有實現(xiàn)的函數(shù)
#include <iostream>
using 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 。一個父類中都是純虛函數(shù),這個類就是接口類 ; 如果這個父類不全是純函數(shù)那這個父類就是抽象類。
② 有純虛函數(shù)的類 , 不能被實例化 。只能通過繼承 , 在子類中實現(xiàn)(必須在子類中重寫)
重點補充:
① 重寫虛函數(shù) , 函數(shù)名稱 / 函數(shù)參數(shù)列表 / 函數(shù)返回值類型必須是一樣(絕大部分情況 )
② 特殊情況:
#include <iostream>
using 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òu)成重寫 , 這個情況叫協(xié)變。
虛析構(gòu)
為了時子類,父類中的機構(gòu)函數(shù)都被調(diào)用,需要使用虛析構(gòu)(不然 , 只會調(diào)用父類的的 )
#include <iostream>
using 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é)果:

關于虛繼承
存在多繼承的時候一定要使用虛繼承
B,C繼承于A 。 D繼承B和C。若A與一個參數(shù)a,使用D.a就會造成歧義(從B,C繼承了2個a)。那么B,C都要使用虛繼承
class B : virtual public A
虛繼承 只是繼承使用權(quán)(相當于指針),并不復制A中的a
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文題目:C++繼承(二)-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://chinadenli.net/article42/ccggec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、移動網(wǎng)站建設、全網(wǎng)營銷推廣、網(wǎng)站設計公司、手機網(wǎng)站建設、外貿(mào)網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容