鉴于以下...
#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;
}
这几乎按照人们的预期运行,导致以下输出......
调用了基类:Func()!
但是,如果我将以下函数添加到子类中...
class SubClass : public BaseClass {
public:
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};
与任何其他重载一样,如果我提供 int 作为参数,我希望调用 SubClass 函数,如果提供 float,则调用 BaseClass 函数。但是,如果我按原样运行程序(即使用浮动),则情况并非如此......
SubClass::Func() 被调用!
与我预期的不同,我提供的浮点数被转换为整数,并且调用了 SubClass 函数。看起来 SubClass 的函数有效地掩盖了 BaseClass 的函数,尽管它的签名不同。
有人可以解释一下吗?有没有办法通过 SubClass 实例调用 BaseClass 函数而无需强制转换它?
Thanks!
正如你所说,BaseClass
的功能被隐藏SubClass
'是。名字Func
将会发现在SubClass
的范围,然后名称查找停止,Func
in BaseClass
根本不会被考虑,即使它更合适。它们根本不是“超载”。
See 不合格名称查找.
您可以使用using
将它们引入同一范围以使重载起作用。
class SubClass : public BaseClass {
public:
using BaseClass::Func;
~~~~~~~~~~~~~~~~~~~~~
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)