调用基类的重载方法

Calling base class's overloaded method

本文关键字:方法 重载 基类 调用      更新时间:2023-10-16

我有这样的代码:

#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);

则编译时不会出现任何错误,但我希望避免每次都必须编写类作用域操作符。是否有一种方法告诉编译器我试图调用基类的函数的重载?

子类中的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;}
};