我有这段代码:
#include <iostream>
#include <string>
using namespace std;
class A {
public: void Print(int i) {cout<<i;}
};
class B : public A {
public: void Print(string s) {cout<<s;}
};
int main() {
B bInstance;
bInstance.Print(1);
return 0;
}
这给了我一个错误:
error: invalid conversion from 'int' to 'const char*' [-fpermissive]
意味着它试图在不考虑继承的重载的情况下调用B的Print。但是,A的打印应该可以由B实例调用。事实上,如果我将呼叫改为
bInstance.A::Print(1);
然后它编译没有任何错误,但我想避免每次都要编写类范围操作符。 有没有办法告诉编译器我试图调用基类的函数重载?
答案 0 :(得分:12)
子类中的Print()
成员函数隐藏超类的成员函数Print()
。因此,编译器将看不到A::Print()
并将尝试调用B::Print()
,抱怨int
无法转换为字符串。
要将A::Print()
引入重载集,您可以引入using
声明:
class A {
public:
void Print(int i) {cout<<i;}
};
class B : public A {
public:
using A::Print;
// ^^^^^^^^^^^^^^^
void Print(string s) {cout<<s;}
};
以下是经过必要修改后代码的live example。