为什么选择了重载基类值的默认参数值,而不是执行的派生方法中指定的默认值

时间:2015-04-04 16:00:48

标签: c++

我在玩逻辑转换时注意到了一件奇怪的事情。这是我的代码:

#include <iostream>

using namespace std;
class C
{
public:
    virtual int shift(int n = 2) const { return n << 2; }
};
class D
    : public C
{
public:
    int shift(int n = 1) const { return n << 5; }
};
int main()
{
    const D d;
    const C *c = &d;
    cout << c->shift() << endl;
    return 0;
}

程序返回64,所以它取自C类的值n = 2和D类的函数体。

从函数中删除const后它工作正常,但我不明白为什么。有人能帮助我吗?

1 个答案:

答案 0 :(得分:6)

默认参数值基于静态类型(编译时已知的类型)。

虚拟功能实现的选择取决于运行时对象的派生类型最多,动态类型