调用基类的重载方法

Mic*_*Mic 7 c++ methods inheritance overloading class

我有这个代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

error: invalid conversion from 'int' to 'const char*' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

这意味着它试图在不考虑继承过载的情况下调用B的Print.但是,A的打印应该可以由B实例调用.事实上,如果我将呼叫改为

bInstance.A::Print(1);
Run Code Online (Sandbox Code Playgroud)

然后它编译没有任何错误,但我想避免每次都要编写类范围操作符.有没有办法告诉编译器我试图调用基类的函数重载?

And*_*owl 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;}
};
Run Code Online (Sandbox Code Playgroud)

以下是在必要的修改后代码工作的实例.

  • @Mic,将其放在“B”的“public:”部分中。我猜你在 `public: void Print(string s) {cout&lt;&lt;s;}` 行之前添加了它,这将使它成为私有的。 (2认同)