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

Syn*_*dog 2 c++ inheritance overloading shadowing

鉴于以下...

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

这几乎和人们预期的一样运行,导致以下输出......

BaseClass:Func() 调用!

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

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

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

SubClass::Func() 调用!

我提供的浮点数不是我所期望的,而是转换为整数,然后调用 SubClass 函数。似乎 SubClass 的函数有效地掩盖了 BaseClass 的函数,即使它的签名不同。

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

谢谢!

son*_*yao 5

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

请参阅非限定名称查找

您可以使用using将它们引入到相同的作用域中以使重载起作用。

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