C++多態(tài)實(shí)現(xiàn)方式詳情
注:文章轉(zhuǎn)自公眾號(hào):Coder梁(ID:Coder_LT)
在我們之前介紹的繼承的情況當(dāng)中,派生類調(diào)用基類的方法都是不做任何改動(dòng)的調(diào)用。
但有的時(shí)候會(huì)有一些特殊的情況,我們會(huì)希望同一個(gè)方法在不同的派生類當(dāng)中的行為是不同的。舉個(gè)簡(jiǎn)單的例子,比如speak
方法,在不同的類當(dāng)中的實(shí)現(xiàn)肯定是不同的。如果是Human
類,就是正常的說(shuō)話,如果是Dog
類可能是汪汪,而Cat類則是喵喵。
在這種情況下只是簡(jiǎn)單地使用繼承是無(wú)法滿足我們的要求的,最好能夠有一個(gè)機(jī)制可以讓方法有多種形態(tài),不同的對(duì)象去調(diào)用的邏輯不同。這樣的行為稱為多態(tài)。
這里稍微強(qiáng)調(diào)一下,多態(tài)是一種面向?qū)ο蟮脑O(shè)計(jì)思路,本身和C++不是強(qiáng)綁定的,其他語(yǔ)言當(dāng)中一樣有多態(tài),只不過(guò)實(shí)現(xiàn)的方式可能有所不同。
在C++當(dāng)中有兩種重要的機(jī)制用于實(shí)現(xiàn)多態(tài):
- 在派生類當(dāng)中重新定義基類的方法
- 使用虛方法
我們來(lái)看一個(gè)例子:
class Mammal { ?private: ? string name; ?public: ? Mammal(string n): name(n) {} ? ? ?string Name() const{ ? ? ? ? ? ? return name; ? ? ? ? } ? virtual void speak() const { ? ?cout << "can't say anything" << endl; ? } ? ? ?virtual ~Mammal() {}; }; class Human : public Mammal{ ?private: ? string job; ?public: ? Human(string n, string j): Mammal(n), job(j) {} ? virtual void speak() const { ? ?cout << "i'm human" << endl; ? } };
由于示例比較簡(jiǎn)單,所以我們把類的聲明和實(shí)現(xiàn)寫在一起了。
從結(jié)構(gòu)上來(lái)看,這就是一個(gè)簡(jiǎn)單的繼承,我們實(shí)現(xiàn)了兩個(gè)類,一個(gè)叫做Mammal
,一個(gè)叫做Human
,然后給它們各自定義了一些成員變量。
值得注意的是speak
函數(shù),我們?cè)诤瘮?shù)聲明前面加上了一個(gè)關(guān)鍵字virtual
,這表示這是一個(gè)虛函數(shù)。
方法被定義成虛方法之后,在程序執(zhí)行的時(shí)候,將會(huì)根據(jù)派生類的類型來(lái)選擇執(zhí)行的方法版本。在進(jìn)行調(diào)用的時(shí)候,程序是根據(jù)對(duì)象類型而不是引用和指針的類型來(lái)選擇執(zhí)行的方法,
如:
Mammal *m = new Human("man", "spiderman"); m->speak();
這里我們用一個(gè)Mammal
的指針指向了一個(gè)Human
類型的對(duì)象,當(dāng)我們調(diào)用方法的時(shí)候,由于speak
方法是一個(gè)虛方法。因此執(zhí)行的時(shí)候程序會(huì)根據(jù)對(duì)象的類型也就是Human
去執(zhí)行Human
對(duì)象中的speak
方法,而不是Mammal
中的。
通常我們會(huì)將析構(gòu)函數(shù)也設(shè)置成虛方法,因?yàn)榕缮惍?dāng)中往往有一些專屬成員,這是一種慣例。因?yàn)槿绻鰳?gòu)函數(shù)不是虛函數(shù),那么只會(huì)調(diào)用對(duì)應(yīng)指針類型的析構(gòu)函數(shù),這意味著可能在一些情況下產(chǎn)生錯(cuò)誤和問(wèn)題。
在上述的示例當(dāng)中,我們是將類方法的實(shí)現(xiàn)和聲明寫在一起了,如果還是采取和之前一樣分開實(shí)現(xiàn)的方式,需要注意我們無(wú)需在函數(shù)簽名中加上virtual
關(guān)鍵字。
到此這篇關(guān)于C++多態(tài)實(shí)現(xiàn)方式詳情的文章就介紹到這了,更多相關(guān)C++多態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言判斷一個(gè)數(shù)是否是2的冪次方或4的冪次方
本文中我們來(lái)看一下如何用C語(yǔ)言判斷一個(gè)數(shù)是否是2的冪次方或4的冪次方的方法,并且判斷出來(lái)是多少次方,需要的朋友可以參考下2016-06-06C++?Qt開發(fā)之關(guān)聯(lián)容器類使用方法詳解
當(dāng)我們談?wù)摼幊讨械臄?shù)據(jù)結(jié)構(gòu)時(shí),順序容器是不可忽視的一個(gè)重要概念,Qt?中提供了豐富的容器類,用于方便地管理和操作數(shù)據(jù),本章我們將主要學(xué)習(xí)關(guān)聯(lián)容器,主要包括?QMap?,QSet和?QHash,感興趣的朋友跟著小編一起來(lái)學(xué)習(xí)吧2023-12-12C語(yǔ)言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法
這篇文章主要介紹了C++實(shí)現(xiàn)單鏈表刪除倒數(shù)第k個(gè)節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式分析了C++單鏈表的定義、遍歷及刪除相關(guān)操作技巧,需要的朋友可以參考下2017-05-05更優(yōu)雅的C++字符串格式化實(shí)現(xiàn)方法詳解
在用C++編寫代碼時(shí),經(jīng)常需要用到字符串拼接及格式化,尤其是在拼寫sql語(yǔ)句時(shí)。所以本文為大家介紹了更優(yōu)雅的C++字符串格式化實(shí)現(xiàn)方法,希望對(duì)大家有所幫助2023-04-04淺談C語(yǔ)言共用體和與結(jié)構(gòu)體的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談C語(yǔ)言共用體和與結(jié)構(gòu)體的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02