This question already has answers here:
Why does an overridden function in the derived class hide other overloads of the base class?
(4个答案)
4年前关闭。
鉴于以下...
这几乎可以像预期的那样运行,从而产生以下输出...
但是,如果我将以下函数添加到SubClass ...
像任何其他重载一样,如果我提供int作为参数,我希望可以调用SubClass函数,而如果提供float则可以调用BaseClass。但是,如果我按原样运行程序(即使用浮点数),则不是这种情况...
并非我所期望的那样,我提供的浮点数被强制转换为整数,然后调用SubClass函数。看起来SubClass的功能有效地掩盖了BaseClass的功能,即使其签名不同。
有人可以阐明这一点吗?有没有一种方法可以通过SubClass实例调用BaseClass函数,而不必进行强制转换?
谢谢!
(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