C++子类中的基类函数重载
C++ Base Class Function Overloading in a Subclass
给定以下内容...
#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() 调用!
但是,如果我将以下函数添加到子类...
class SubClass : public BaseClass {
public:
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};
像任何其他重载一样,如果我提供一个 int 作为我的参数,我希望调用 SubClass 函数,如果我提供一个浮点数,我希望调用 BaseClass 函数。 但是,如果我按原样运行程序(即使用浮点数),则情况并非如此......
子类::Func() 调用!
与我所期望的相反,我提供的浮点数被转换为整数,并调用 SubClass 函数。 似乎SubClass的函数有效地隐藏了BaseClass的函数,即使它的签名不同。
有人可以对此有所了解吗? 有没有办法通过子类实例调用 BaseClass 函数而不必强制转换它?
谢谢!
正如你所说,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!";
}
};
子类的Func
方法将在成员名称查找中隐藏基类的Func
方法,因此将使用任何数字参数调用,并转换为整数。
如果要在子类中同时使用这两种方法,请使用 using BaseClass::Func;
拉取基类的Func
方法。这会将基Func
视为子类的成员,不再被子类的名称查找隐藏。
相关文章:
- 有没有办法将重载的类函数绑定到函数对象?
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 将基类的成员函数重载到其他派生类C++
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 使用派生类进行函数重载
- 普通函数重载模板函数但普通不重载模板类?
- 使用另一个类中的函数重载函数
- 从派生类调用重载函数
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 用户定义的构造函数重载与参数超类的重载不匹配
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- 为什么无法访问基类的函数重载
- 重载基类函数是不好的做法吗?
- 模板专用类之间的构造函数重载
- QT Qt并发运行与重载类函数
- 模板化函数重载和类外定义时出错
- 使用模板类的函数重载
- 对基类中重载函数的不明确调用
- C++子类中的基类函数重载
- 在组合模板和类函数重载时遇到麻烦