鉴于以下内容......
#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函数而不必抛出它?
谢谢!
答案 0 :(得分:4)
正如你所说,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!";
}
};
答案 1 :(得分:2)
子类&#39; Func
方法将隐藏基类&#39;成员名称查找中的Func
方法,因此将使用任何数字参数调用,并转换为整数。
如果要在子类中使用这两种方法,请拉出基类&#39;使用Func
的{{1}}方法。这会将基类using BaseClass::Func;
视为子类的成员,不再被子类隐藏。名称查找。