具有继承的重载方法/运算符不起作用
Overload method/operator with inheritance won't work
当一个类只能持续访问其内容时,我编写了代码,而这是由提供相同方法但对其成员具有正常访问权限的其他类继承的。当我试图通过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
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++11+=当RHS有多个字符串或字符时,运算符不起作用
- C++ - 父级中的 CRTP 分配运算符不起作用
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?
- 为什么重载运算符不起作用?
- 重载运算符<<不起作用
- 构造函数和运算符不起作用
- 重载+运算符不起作用
- + 由于有条件,运算符不起作用
- 集合迭代器的加号运算符不起作用
- 重载运算符<<不起作用
- 取消引用运算符不起作用(语法问题?
- 为什么当bool = true时补码运算符不起作用?
- 为什么增量运算符不起作用?
- 插入和提取运算符不起作用
- "if"语句"or"运算符不起作用
- 具有继承的重载方法/运算符不起作用
- 使用 OSTREAM 重载<<运算符不起作用。为什么?
- 赋值运算符不起作用
- 继承的运算符 = 不起作用