2016年11月8日 星期二

C++ Virtual Function

因為準備面試所以複習了一下實作 C++ 多型 (Polymorphism) 的 virtual function。

Virtual function 的主要目的是要在 runtime 的時候解決 switch 的問題,於是我們不需要實際寫一個 switch 去判斷現在的目標是什麼 type。

直接看 code :

#include <iostream>  

using std::cout;  
using std::cerr;  
using std::endl;  

class Otoko {  
public:  
  virtual bool can_ask_line_id() = 0;  
};  

class Ikemen: public Otoko {  
public:  
  virtual bool can_ask_line_id() {  
    return true;  
  }  
};  

class Otaku: public Otoko {  
public:  
  virtual bool can_ask_line_id() {  
    cerr << "死ね!!" << endl;  
    return false;  
  }  
};  

int main(int argc, char* argv[]) {  
  Otoko *yuujinA = new Ikemen(),  
        *yuujinB = new Otaku();  

  cout << (yuujinA->can_ask_line_id() ? "No problem" : "Impossible") << endl;  
  cout << (yuujinB->can_ask_line_id() ? "No problem" : "Impossible") << endl;  

  delete yuujinA;  
  delete yuujinB;  

  return 0;  
}


其中變數 yuujinA, yuujinB 的型別同樣都是 Otoko*,但是分別指到不同的 class (Ikemen, Otaku)。

在 runtime 的時候,我不需要去寫:

if (yuujinA 是 Ikemen) {  
} else if (yuujinA 是 Otaku) {  
} else {  
}  

當然更不用:
switch (yuujinA 的型別) {  
  case Ikemen:  
  case Otaku:  
}  

只需要在 class 裡面宣告、定義 virtual function,在 runtime 的時候便會自動呼叫對應的 virtual function。

所以儘管 yuujinA 跟 yuujinB 有同樣的型別 Otoko*,runtime 的時候呼叫的 virtual function 便會依照他們實際是指到哪個 class ,再去做對應的 function call。

而沒有加上 virtual 的 function,例如 whoami,就只會去看 yuujinA, yuujinB 宣告的時候的 type 去做對應的 function call。



<<名詞解釋>>

Otoko: 男人
Ikemen: 帥哥
Otaku: 阿宅
yuujinA: 友人A
yuujinB: 友人B

沒有留言:

張貼留言