C++ Base Class 子类中的函数重载

C++ Base Class Function Overloading in a Subclass

鉴于以下...

#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() called!

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

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

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

SubClass::Func() called!

与我预期的不同,我提供的浮点数被强制转换为整数,并调用了 SubClass 函数。看起来 SubClass 的功能有效地隐藏了 BaseClass 的功能,即使它的签名不同。

有人可以解释一下吗?有没有办法通过 SubClass 实例调用 BaseClass 函数而不必转换它?

谢谢!

subclass' Func 方法将在成员名称查找中隐藏基础 class' Func 方法,因此将使用 any 数字参数,转换为整数。

如果您想在子class 中使用这两种方法,请使用using BaseClass::Func; 提取基础class'Func 方法。这会将基 Func 视为子 class 的成员,不再被子 class 的名称查找隐藏。

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

Unqualified name lookup

您可以使用 using 将它们引入相同的作用域以进行重载。

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