为什么覆盖方法并将const添加到参数类型有效?

Izz*_*zzy 6 c++

考虑以下示例:

#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参数并重载的函数,但它解决了一个不同的问题。这个问题是关于不可能重载基类的方法,而这个问题解决了能够覆盖派生方法的问题。

son*_*yao 8

因为它们的签名实际上是相同的。

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

...

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

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

  • @Izzy如引号所示,*但不会修改参数的属性*,因此参数在函数中仍为const,即,您不能在Derived主体内修改参数a。 :func`。[LIVE](https://wandbox.org/permlink/opOprhy9NmjP1PTP) (3认同)