我基本是复制了this example来自 Herb Sutter 的书 Exceptional C++
中的 Item 21. Overriding Virtual Functions
。
#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 页用以下文字解释了这一点:要记住的是,像重载一样,默认参数取自对象的静态类型(此处为 Base),因此采用默认值 10。不过函数恰好是virtual,所以实际调用的函数是根据对象的动态类型(这里是Derived)。
C++11 标准中是否有任何引用支持这一点?
最佳答案
8.3.6/10:
虚函数调用 (10.3) 在虚函数声明中使用默认参数,这些参数由表示对象的指针或引用的静态类型决定。派生类中的重写函数不会从它重写的函数中获取默认参数。
关于c++ - 标准中是否有任何引用支持下面显示的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23727952/