Car*_*rol 5 c++ overriding constants signature
当我在写一个带有const参数而不是非常量参数的overide函数时,我以为编译器会报错,因为base函数有非常量参数,但是编译成功了。为什么?
我的代码:
#include <iostream>
class A
{
public:
virtual uint64_t cal(uint64_t value)
{
std::cout << value << std::endl;
return value;
}
};
class B : public A
{
public:
uint64_t cal(const uint64_t value) override;
};
uint64_t B::cal(const uint64_t value)
{
std::cout << value + 1 << std::endl;
return (value+1);
}
int main()
{
B b;
b.cal(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么?
因为函数参数的顶部 const 限定符在声明中被忽略。
uint64_t cal(uint64_t value);
Run Code Online (Sandbox Code Playgroud)
和
uint64_t cal(const uint64_t value);
Run Code Online (Sandbox Code Playgroud)
声明完全相同类型的函数。cal是一个接受 auint64_t并返回 a的函数uint64_t。在const预选赛中,使调用代码没有任何区别,因为value始终是一个副本,在参数传递的。
唯一的区别在于函数体,其中const限定符将阻止您修改参数。但这是一个实现细节。
这种差异甚至会引发编码风格问题。例如见
删除标题中用作函数参数的“原始”类型前面的“const”是否更好?