考虑以下示例:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我重写了该func方法,但将const添加到参数中,在这种情况下,链接器应发出错误消息。函数不被覆盖,或者函数参数不应为const。
但是令我惊讶的是,此代码可以链接并起作用。
我想念什么吗?为什么此代码有效?
尽管类似于带有const参数并重载的函数,但它解决了一个不同的问题。这个问题是关于不可能重载基类的方法,而这个问题解决了能够覆盖派生方法的问题。
因为它们的签名实际上是相同的。
参数列表中每个功能参数的类型根据以下规则确定:
...
4)从参数类型中删除顶级cv限定词(此调整仅影响函数类型,但不修改参数的属性:
int f(const int p, decltype(p)*);并int f(int, const int*);声明相同的函数)
这意味着,void func(int a)并且void func(const int a)被视为相同的函数类型;则覆盖有效。