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

时间:2011-06-03 13:21:14

标签: c++ inheritance operator-overloading

我编写代码时,一个类只能持续访问其内容,并且由其他提供相同方法的类继承,但可以正常访问其成员。当我尝试通过gcc编译它时,我得到以下错误代码:

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

这里是可编译的示例代码:

#include<stdio.h>

class ConstA {
    public:
        void operator()() const {
            printf("const\n");
        }
};

class A : public ConstA {
    public:
        void operator()() {
            printf("non-const\n");
        }
};

class B : public A {
};

void f(const A& a) {
    a();
}

int main() {
    B b;
    f(b);
}

编译器尝试在没有const属性的情况下调用方法(operator()),而const方法可以在基本ConstA类中访问。我不知道为什么会出现这种错误。

2 个答案:

答案 0 :(得分:10)

const方法无法访问,派生类版本的基类版本隐藏,这是一个烦人的问题。您需要using ConstA::operator()才能将其纳入A

的范围
class A : public ConstA{
public:
  using ConstA::operator();

  void operator()(){
    printf("non-const\n");
  }
};

如需进一步阅读,请查看this question of mine,其中有一些很好的解释。

答案 1 :(得分:2)

这是因为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()是隐藏的!为了唤起你,你必须明确地转向A.
因此,在您的示例中,您必须明确施放ConstA