如下面的程序:
?1?????#include?<?iostream?>
?2?
?3?????using?namespace?std;
?4?
?5?????class?base{
?6?????public:
?7?????????virtual?void?f(char?i){
?8?????????????cout?<<?"Base?class:?"?<<?i?<<?endl;
?9?????????};
10?????????virtual?void?f(double?d){
11?????????????cout?<<?"Base?class:?"?<<?d?<<?endl;
12?????????}
13?????};
14?
15?????class?derived?:?public?base{
16?????public:
17?????????void?f(char?i){
18?????????????cout?<<?"Derived?class:?"?<<?i?<<?endl;
19?????????}
20?????};
21?
22?????int?main(int?argc,?char**?argv)
23?????{
24?????????base?*pb?=?new?derived;
25?????????pb->f(2.0);
26?????????delete?pb;
27?????????return?0;
28?????}
29?
開(kāi)始的時(shí)候感覺(jué)有點(diǎn)迷惑,被調(diào)用的是 base 的 f 呢?還是 derived 的 f(需要進(jìn)行參數(shù)類型轉(zhuǎn)換)。實(shí)驗(yàn)證明,被調(diào)用的是 base 的 f。
因?yàn)橹剌d是根據(jù)靜態(tài)類型來(lái)選擇函數(shù)的,亦即由 pb 本身的類型來(lái)決定。而虛擬則是根據(jù)動(dòng)態(tài)類型來(lái)選擇函數(shù),由 pb 指向的對(duì)象類型決定。因此編譯器首先根據(jù)重載來(lái)選擇一個(gè)基類的函數(shù),如果該函數(shù)為虛擬函數(shù)且被派生類實(shí)現(xiàn),則再通過(guò)多態(tài)機(jī)制調(diào)用派生類函數(shù)。