考虑以下示例:
#include <iostream>
#include <string>
class Base {
public:
virtual void func(int a) {}
};
class Derived : public Base {
public:
void func( const int a) override {
}
};
int main()
{
Derived d;
d.func(1);
return 1;
}
我重写了func
方法,但是在参数中添加了const ,在这种情况下,链接器应该发出错误消息。函数不被覆盖,或者函数参数不应为const。
但是令我惊讶的是,这段代码可以链接并起作用。
您可以找到一个online example here。
我想念什么吗?为什么此代码有效?
尽管与Functions with const arguments and Overloading类似,它解决了一个不同的问题。这个问题是关于不可能重载基类的方法,而这个问题解决了能够重载派生方法的问题。
答案 0 :(得分:8)
因为他们的signatures实际上是相同的。
参数列表中每个功能参数的类型根据以下规则确定:
...
4)从参数类型中删除了顶级cv限定符(此调整仅影响函数类型,但不修改参数的属性:
int f(const int p, decltype(p)*);
和int f(int, const int*);
声明相同的功能)
这意味着void func(int a)
和void func(const int a)
被视为相同的函数类型;则覆盖有效。