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
沒有留言:
張貼留言