9

我有这个代码:

#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 的 Print 应该可以由 B 实例调用。实际上,如果我将呼叫更改为

bInstance.A::Print(1);

然后它编译没有任何错误,但我想避免每次都编写类范围运算符。有没有办法告诉编译器我正在尝试调用基类的函数重载?

4

1 回答 1

13

Print()子类中的成员函数隐藏Print()了超类的成员函数。因此,编译器将看不到A::Print()并尝试调用B::Print(),并抱怨int无法将 an 转换为字符串。

要引入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;}
};

这是您的代码在必要的修改后工作的实时示例

于 2013-03-21T19:41:19.880 回答