C++子类中的基类函数重载

C++ Base Class Function Overloading in a Subclass

本文关键字:类函数 重载 基类 子类 C++      更新时间:2023-10-16

给定以下内容...

#include <iostream>
using namespace std;
class BaseClass {
public:
    void Func(float f) {
        cout << "BaseClass:Func() called!";
    }
};
class SubClass : public BaseClass {
};
int main() {
    SubClass sub;
    sub.Func(1.1f);
    return 0;
}

这几乎按照人们的预期运行,导致以下输出......

BaseClass:Func() 调用!

但是,如果我将以下函数添加到子类...

class SubClass : public BaseClass {
public:
    void Func(int i) {                        // accepts an int, not a float!
        cout << "SubClass::Func() called!";
    }
};

像任何其他重载一样,如果我提供一个 int 作为我的参数,我希望调用 SubClass 函数,如果我提供一个浮点数,我希望调用 BaseClass 函数。 但是,如果我按原样运行程序(即使用浮点数),则情况并非如此......

子类::Func() 调用!

与我所期望的相反,我提供的浮点数被转换为整数,并调用 SubClass 函数。 似乎SubClass的函数有效地隐藏了BaseClass的函数,即使它的签名不同。

有人可以对此有所了解吗? 有没有办法通过子类实例调用 BaseClass 函数而不必强制转换它?

谢谢!

正如你所说,BaseClass的功能被SubClass隐藏了。名称Func将在SubClass的范围内找到,然后名称查找停止,Func根本不会考虑BaseClass,即使它更合适。它们根本不是"超载"。

请参阅非限定名称查找。

您可以使用using将它们引入同一范围以使重载工作。

class SubClass : public BaseClass {
public:
    using BaseClass::Func;
    ~~~~~~~~~~~~~~~~~~~~~
    void Func(int i) {                        // accepts an int, not a float!
        cout << "SubClass::Func() called!";
    }
};

子类的Func方法将在成员名称查找中隐藏基类的Func方法,因此将使用任何数字参数调用,并转换为整数。

如果要在子类中同时使用这两种方法,请使用 using BaseClass::Func; 拉取基类的Func方法。这会将基Func视为子类的成员,不再被子类的名称查找隐藏。