最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++多態(tài)實現(xiàn)方式詳情

 更新時間:2022年01月05日 10:05:48   作者:唐梁  
這篇文章主要介紹了C++多態(tài)實現(xiàn)方式詳情,多態(tài)是一種面向?qū)ο蟮脑O(shè)計思路,本身和C++不是強綁定的,其他語言當(dāng)中一樣有多態(tài),只不過實現(xiàn)的方式可能有所不同。下面來一起了解更多詳細(xì)內(nèi)容吧

:文章轉(zhuǎn)自公眾號:Coder梁(ID:Coder_LT)

在我們之前介紹的繼承的情況當(dāng)中,派生類調(diào)用基類的方法都是不做任何改動的調(diào)用。

但有的時候會有一些特殊的情況,我們會希望同一個方法在不同的派生類當(dāng)中的行為是不同的。舉個簡單的例子,比如speak方法,在不同的類當(dāng)中的實現(xiàn)肯定是不同的。如果是Human類,就是正常的說話,如果是Dog類可能是汪汪,而Cat類則是喵喵。

在這種情況下只是簡單地使用繼承是無法滿足我們的要求的,最好能夠有一個機制可以讓方法有多種形態(tài),不同的對象去調(diào)用的邏輯不同。這樣的行為稱為多態(tài)。

這里稍微強調(diào)一下,多態(tài)是一種面向?qū)ο蟮脑O(shè)計思路,本身和C++不是強綁定的,其他語言當(dāng)中一樣有多態(tài),只不過實現(xiàn)的方式可能有所不同。

在C++當(dāng)中有兩種重要的機制用于實現(xiàn)多態(tài):

  • 在派生類當(dāng)中重新定義基類的方法
  • 使用虛方法

我們來看一個例子:

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;
? }
};

由于示例比較簡單,所以我們把類的聲明和實現(xiàn)寫在一起了。

從結(jié)構(gòu)上來看,這就是一個簡單的繼承,我們實現(xiàn)了兩個類,一個叫做Mammal,一個叫做Human,然后給它們各自定義了一些成員變量。

值得注意的是speak函數(shù),我們在函數(shù)聲明前面加上了一個關(guān)鍵字virtual,這表示這是一個虛函數(shù)。

方法被定義成虛方法之后,在程序執(zhí)行的時候,將會根據(jù)派生類的類型來選擇執(zhí)行的方法版本。在進(jìn)行調(diào)用的時候,程序是根據(jù)對象類型而不是引用和指針的類型來選擇執(zhí)行的方法,

如:

Mammal *m = new Human("man", "spiderman");
m->speak();

這里我們用一個Mammal的指針指向了一個Human類型的對象,當(dāng)我們調(diào)用方法的時候,由于speak方法是一個虛方法。因此執(zhí)行的時候程序會根據(jù)對象的類型也就是Human去執(zhí)行Human對象中的speak方法,而不是Mammal中的。

通常我們會將析構(gòu)函數(shù)也設(shè)置成虛方法,因為派生類當(dāng)中往往有一些專屬成員,這是一種慣例。因為如果析構(gòu)函數(shù)不是虛函數(shù),那么只會調(diào)用對應(yīng)指針類型的析構(gòu)函數(shù),這意味著可能在一些情況下產(chǎn)生錯誤和問題。

在上述的示例當(dāng)中,我們是將類方法的實現(xiàn)和聲明寫在一起了,如果還是采取和之前一樣分開實現(xiàn)的方式,需要注意我們無需在函數(shù)簽名中加上virtual關(guān)鍵字。

到此這篇關(guān)于C++多態(tài)實現(xiàn)方式詳情的文章就介紹到這了,更多相關(guān)C++多態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

唐河县| 六枝特区| 乡城县| 南和县| 嵊泗县| 闽侯县| 广丰县| 修文县| 台江县| 肇东市| 鄂州市| 库尔勒市| 台东县| 临沂市| 温宿县| 广灵县| 郓城县| 宜宾市| 宾川县| 射阳县| 旬邑县| 孝感市| 琼中| 游戏| 股票| 吐鲁番市| 双流县| 锦屏县| 万载县| 阳江市| 寻乌县| 阿拉善左旗| 安国市| 郸城县| 平陆县| 荆门市| 苍梧县| 洪泽县| 繁昌县| 仙桃市| 延寿县|