2013-02-08 68 views
1

請幫我找到它背後的原因:默認參數

#include <iostream> 
using std::cout; 

class A { 
    public: 
    virtual void fun(int a = 5) { cout<<a; } 
}; 
class B::public A { 
    public: 
    void fun(int a = 10) { 
     cout<<"Inside A::B::fun().\n"; 
     cout<<"\n"<<a; 
    } 
}; 
int _tmain(int argc, _TCHAR* argv[]) { 
    A *obj = new B(); 
    obj->fun(); 
    reutrn 0; 
} 

Althought它調用B ::樂趣(),還是打印5,爲什麼以及如何工作的?

+0

你使用MSVC嗎? –

+0

是@Mark,我正在使用MS VC++ 2010 Express – null

回答

1
A *obj = new B(); 
obj->fun(); 

在這段代碼,fun()是多態調用 - 呼叫者使用的A::fun()(只)的知識,但電話被調度到重定向至B::fun()執行的指針。該函數參數 - a/5 - 由調用方在重定向調用之前提供(前一種方式 - 在編譯期間) - A的默認值是可見的,而不是B的。

如果你想要的東西,就像你似乎期望,你會發現它的工作原理有A::fun(int a = -1)或一些其他的標記值,與fun檢查標記值然後根據需要使用5或10替換它的實現。這樣,特定於實現的值在調用期間被併入,而不是在之前。

0

默認參數不具有動態調度行爲的特徵。它們是靜態的。 Scott Meyers在「Effective C++」中詳細討論了這個問題