我编写代码时,一个类只能持续访问其内容,并且由其他提供相同方法的类继承,但可以正常访问其成员。当我尝试通过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类中访问。我不知道为什么会出现这种错误。
答案 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