2014-01-21 214 views
0

下面是我的測試代碼,我認爲它會輸出「Der:12」,但結果是「Der:11」,任何人都可以告訴我爲什麼輸出這個,默認參數存儲?C++虛函數默認參數值

#include <stdio.h> 
class Base{ 
public: 
    virtual void show(int i = 11) 
    { 
     printf("Base:%d\n", i); 
    } 
}; 

class Der : public Base{ 
public: 
    virtual void show(int i = 12) 
    { 
     printf("Der:%d\n", i); 
    } 
}; 

int main() 
{ 
    Base *p = new Der(); 
    p->show(); 

    return 0; 
} 
+0

也在這裏... [虛擬函數是否有默認參數?](http://stackoverflow.com/questions/3533589/can-virtual-functions-have-default-parameters) – godel9

回答

0

嗯,我不知道它實際上是有效的覆蓋虛擬函數與一個不同的默認參數,它肯定是不明智的。但另一方面,編譯器做的是正確的事情,即使它違背了你的期望。

Base *p; 
p->show(); 

這裏發生什麼是編譯器查看Base的函數沒有參數。沒有之一,但它發現一個參數的功能,並與11

默認參數調用show(int)但功能是虛擬的,所以因爲p的動態類型爲Der,它Der::show(int)實際獲取稱爲 - 但至關重要的是,仍然與Base的默認參數爲11,但默認參數靜態查找,而不是使用運行時調度。

我還沒有嘗試過,但如果你說

Der *p = new Der(); 
p->show(); 

你會得到12輸出,而不是我想像。