2014-05-18 42 views
0

我基本上從Item 21. Overriding Virtual Functions複製this example在草本薩特的書Exceptional C++標準中是否有支持以下結果的報價?

#include <iostream> 

class Base { 
public: 
    virtual void f(int i = 10) { std::cout << i << '\n'; } 
}; 

class Derived : public Base { 
public: 
    void f(int i = 20) { std::cout << i << '\n'; } 
}; 

int main() 
{ 
    Base* p = new Derived; 
    p->f(); 
} 

令人驚訝的(至少對我來說)的代碼打印10(不是20),筆者在第122頁解釋了這個用下面的話:The thing to remember is that, like overloads, default parameters are taken from the static type (here Base) of the object, hence the default value of 10 is taken. However, the function happens to be virtual, so the function actually called is based on the dynamic type (here Derived) of the object.

是否有在C++ 11的任何報價標準支持這個?

+1

可能的複製,請參閱下面的答案: http://stackoverflow.com/questions/3533589/can-virtual-functions-have-default-parameters – vsoftco

+0

香草口吃,真的嗎? –

回答

1

§8.3.6/ 10(又名[dcl.fct.default]/10):

虛擬函數調用(10.3)使用默認參數在虛擬函數由確定的申報靜態類型的指針或引用表示對象。派生類中的重寫函數不會從它覆蓋的函數獲取默認參數。 [強調]

這具體報價爲N3337,但在我的記憶中,C++的這部分一直保持多年來基本上是恆定的,所以我希望更多的比最微小的文字之間變化標準的不同修訂。

+0

嗨傑裏,抱歉的比賽條件:)我的回答是第一次自動轉換成評論,並且當我編輯時發佈它:) – vsoftco

+0

+1因爲這是一個更好的答案,加上你先回答了它。 – 101010

+0

@Jerry你說得對。我會糾正這一點。 –

2

8.3.6/10:

虛擬函數調用(10.3)使用默認參數在由所述靜態類型的指針或引用表示所述對象的確定的虛擬函數的聲明。派生類中的重寫函數不會從它覆蓋的函數獲取默認參數。

+1

您通常希望區分段落號和其他段編號,例如'8.3.6/10'或'8.3.6p10',或者使用標籤,如'[dcl.fct.default]/10'。雖然不是在這種特定情況下,但有些情況下,「x.y.z」和「x.y/z」是彼此分開的。 –

+0

謝謝,會編輯它 – vsoftco

+0

@vsoftco我會接受你的答案。我在Jerry Coffin的前幾秒收到了。感謝這兩個。 –

相關問題