自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

EasyC++,多態(tài)

開(kāi)發(fā) 后端
通常我們會(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)題。

[[442919]]

多態(tài)

在我們之前介紹的繼承的情況當(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è)例子:

  1. class Mammal { 
  2.  private: 
  3.   string name
  4.  public
  5.   Mammal(string n): name(n) {} 
  6.      string Name() const{ 
  7.             return name
  8.         } 
  9.   virtual void speak() const { 
  10.    cout << "can't say anything" << endl; 
  11.   } 
  12.      virtual ~Mammal() {}; 
  13. }; 
  14.  
  15. class Human : public Mammal{ 
  16.  private: 
  17.   string job; 
  18.  public
  19.   Human(string n, string j): Mammal(n), job(j) {} 
  20.   virtual void speak() const { 
  21.    cout << "i'm human" << endl; 
  22.   } 
  23. }; 

由于示例比較簡(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í)行的方法,如:

  1. Mammal *m = new Human("man""spiderman"); 
  2. 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)和聲明寫在一起了,如果還是采取和之前一樣分開(kāi)實(shí)現(xiàn)的方式,需要注意我們無(wú)需在函數(shù)簽名中加上virtual關(guān)鍵字。

本文轉(zhuǎn)載自微信公眾號(hào)「Coder梁」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Coder梁公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Coder梁
相關(guān)推薦

2021-12-12 18:13:54

C++This指針

2021-12-09 10:56:50

函數(shù)C++原型

2021-11-26 00:03:20

C++編譯常量

2021-10-26 00:19:51

C++結(jié)構(gòu)體存儲(chǔ)

2021-12-08 10:43:09

C++實(shí)現(xiàn)

2021-12-10 10:45:36

C++函數(shù)Stock

2021-12-30 14:58:58

C++函數(shù)動(dòng)態(tài)

2021-11-27 11:50:09

C++靜態(tài)持續(xù)

2021-11-09 10:38:16

C++Const指針

2021-12-11 19:02:03

函數(shù)C++對(duì)象

2021-11-10 10:48:36

C++函數(shù)指針

2021-12-15 10:25:57

C++運(yùn)算符重載

2021-12-05 18:20:42

C++空間特性

2022-01-04 16:35:42

C++Protected關(guān)鍵字

2021-10-27 16:27:20

C++指針操控

2021-10-26 15:36:17

C++枚舉值類型

2021-12-26 00:08:35

C++初始化列表

2021-10-31 20:24:24

C++for循環(huán)

2021-11-26 10:56:28

C++存儲(chǔ)持續(xù)性

2021-12-14 10:12:58

C++抽象數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)