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

时间:2016-03-08 14:31:35

标签: 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;
}

这可以像人们期望的那样运行,从而产生以下输出......

  

BaseClass:Func()调用!

但是,如果我将以下函数添加到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()调用!

而不是我期望的,我提供的浮点数被转换为整数,并调用SubClass函数。看起来SubClass的功能有效地影响了BaseClass的功能,即使它的签名不同。

有人可以对此有所了解吗?有没有办法通过SubClass实例调用BaseClass函数而不必抛出它?

谢谢!

2 个答案:

答案 0 :(得分:4)

正如你所说,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!";
    }
};

答案 1 :(得分:2)

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

如果要在子类中使用这两种方法,请拉出基类&#39;使用Func的{​​{1}}方法。这会将基类using BaseClass::Func;视为子类的成员,不再被子类隐藏。名称查找。