为什么重写方法并将 const 添加到参数类型有效

Why does overriding a method and adding const to a parameter type work?

本文关键字:参数 类型 有效 添加 const 重写 方法 为什么      更新时间:2023-10-16

请考虑以下示例:

#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。

但令我惊讶的是,这段代码链接并有效。

您可以在此处找到在线示例。

我错过了什么吗?为什么此代码有效?

虽然类似于带有常量参数和重载的函数,但它解决了不同的问题。该问题是关于无法重载基类的方法,而此问题解决了能够重写派生方法的问题。

因为他们的

签名实际上是相同的。

参数列表中各函数参数的类型按以下规则确定:

4( 从参数类型

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

这意味着,void func(int a)void func(const int a) 被视为相同的函数类型;则覆盖有效。