This question already has answers here:
Why does an overridden function in the derived class hide other overloads of the base class?

(4个答案)


4年前关闭。




鉴于以下...
#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;
}

这几乎可以像预期的那样运行,从而产生以下输出...



但是,如果我将以下函数添加到SubClass ...
class SubClass : public BaseClass {
public:
    void Func(int i) {                        // accepts an int, not a float!
        cout << "SubClass::Func() called!";
    }
};

像任何其他重载一样,如果我提供int作为参数,我希望可以调用SubClass函数,而如果提供float则可以调用BaseClass。但是,如果我按原样运行程序(即使用浮点数),则不是这种情况...



并非我所期望的那样,我提供的浮点数被强制转换为整数,然后调用SubClass函数。看起来SubClass的功能有效地掩盖了BaseClass的功能,即使其签名不同。

有人可以阐明这一点吗?有没有一种方法可以通过SubClass实例调用BaseClass函数,而不必进行强制转换?

谢谢!

最佳答案

如您所说,BaseClass的功能被SubClass的功能隐藏。名称Func将在SubClass的作用域中找到,然后名称查找停止,即使更合适,也不会考虑使用Func中的BaseClass。它们根本不是“过载”。

参见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!";
    }
};

关于c++ - 子类中的C++基类函数重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35870081/

10-11 14:29