繁体   English   中英

c ++用const参数而不是非常量参数覆盖虚函数

[英]c++ override virtual function with const parameter instead of non-const parameter

当我在写一个带有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;
}

为什么?

因为函数参数的顶部 const 限定符在声明中被忽略。

uint64_t cal(uint64_t value);

uint64_t cal(const uint64_t value);

声明完全相同类型的函数。 cal是一个接受uint64_t并返回uint64_t的函数。 const限定符对调用代码没有影响,因为value始终是传入参数的副本

唯一的区别在于函数体,其中const限定符将阻止您修改参数。 但这是一个实现细节。

这种差异甚至会引发编码风格问题。 例如见

删除标题中用作函数参数的“原始”类型前面的“const”是否更好?

请注意,在考虑函数类型时会删除顶级 cv 限定符,因此uint64_t cal(uint64_t)uint64_t cal(const uint64_t)被视为相同的函数类型

(强调我的)

参数列表中每个函数参数的类型根据以下规则确定:

4)从参数类型中删除顶级cv-qualifiers(此调整仅影响函数类型,但不修改参数的属性int f(const int p, decltype(p)*);int f(int, const int*);声明相同的函数)

参数的顶级const不是函数签名的一部分。 重载的唯一要求是签名必须匹配。

#include <type_traits>

int main()
{
  static_assert(std::is_same_v<int(int), int(const int)>);
}

编译正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM