具有继承的重载方法/运算符不起作用

Overload method/operator with inheritance won't work

本文关键字:运算符 不起作用 方法 重载 继承      更新时间:2023-10-16

当一个类只能持续访问其内容时,我编写了代码,而这是由提供相同方法但对其成员具有正常访问权限的其他类继承的。当我试图通过gcc编译它时,我得到了以下错误代码:

error: passing ‘const A’ as ‘this’ argument of ‘void A::operator()()’ discards qualifiers 

这是可编译代码示例:

#include<stdio.h>
class ConstA {
    public:
        void operator()() const {
            printf("constn");
        }
};
class A : public ConstA {
    public:
        void operator()() {
            printf("non-constn");
        }
};
class B : public A {
};
void f(const A& a) {
    a();
}
int main() {
    B b;
    f(b);
}

编译器尝试调用不带const属性的方法(运算符()),而const方法在基类ConstA中是可访问的。我不知道为什么我会犯这种错误。

const方法不可访问,基类版本被派生类版本隐藏,这是一个令人讨厌的问题。您需要using ConstA::operator()将其纳入A的范围。

class A : public ConstA{
public:
  using ConstA::operator();
  void operator()(){
    printf("non-constn");
  }
};

为了进一步阅读,看看我的这个问题,它有一些很好的解释。

这是因为C++在重载时使用hiding,所以重载后,ConstA::operator()不可访问
考虑以下程序:

class A {
public:
    void foo() { cout << "A" << endl; }
};
class B : public A {
public:
    void foo(int x) { cout << "B" << endl; }
};
int main() {
    B b;
    b.foo();
}

这个也会产生编译错误,因为B::foo()是隐藏的!要使其envoke,必须显式强制转换为A。
因此,在您的示例中,您必须显式地将强制转换为ConstA