标准中是否有任何引用支持下面显示的结果?

时间:2014-05-18 23:43:02

标签: c++ c++11 override language-lawyer

我基本上在Herb Sutter的书Item 21. Overriding Virtual Functions中从Exceptional C++复制了this example

#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标准中是否有任何引用支持此内容?

2 个答案:

答案 0 :(得分:2)

8.3.6 / 10:

虚函数调用(10.3)使用由表示对象的指针或引用的静态类型确定的虚函数声明中的默认参数。派生类中的重写函数不会从它覆盖的函数中获取默认参数。

答案 1 :(得分:1)

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

  

虚函数调用(10.3)使用虚拟函数声明中的默认参数,该声明由指向对象的静态类型或表示对象的引用确定。派生类中的重写函数不会从它覆盖的函数中获取默认参数。 [强调补充]

这个具体的引用来自N3337,但就我的记忆而言,这部分C ++多年来基本保持不变,所以我希望不止是标准的不同版本之间最微小的措辞变化。 / p>