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

标签 c++ c++11 overriding language-lawyer

我基本是复制了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/

相关文章:

java - 使用类型参数重写泛型方法时出现编译错误

c++ - 无法在C++中使用相同的fstream对象进行读写

javascript - 如何通过 CEF3 中的 JavaScript 访问 C++ 中的动态字符串值?

c++ - 如何在作用域枚举上重载 |= 运算符?

C++ - begin() 返回带有非空列表的 end() 迭代器

java - Java 中重写/隐藏对象类 equals() 方法

css - 在 HTML5 中覆盖共享相同 CSS 表的两个表单

c++ - 为什么 istream_iterator<unsigned char, unsigned char> 抛出 std::bad_cast?

c++ - 是否有必要用导出注释导出实体的模板特化?

c++ - std::chrono 父类(super class)型,函数参数传递