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

时间:2019-06-19 07:37:24

标签: 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;
}

我重写了func方法,但是在参数中添加了const ,在这种情况下,链接器应该发出错误消息。函数不被覆盖,或者函数参数不应为const。

但是令我惊讶的是,这段代码可以链接并起作用。

您可以找到一个online example here

我想念什么吗?为什么此代码有效?

尽管与Functions with const arguments and Overloading类似,它解决了一个不同的问题。这个问题是关于不可能重载基类的方法,而这个问题解决了能够重载派生方法的问题。

1 个答案:

答案 0 :(得分:8)

因为他们的signatures实际上是相同的。

  

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

     

...

     

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

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

相关问题