C++ Base Class 子类中的函数重载
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() called!
但是,如果我将以下函数添加到 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() called!
与我预期的不同,我提供的浮点数被强制转换为整数,并调用了 SubClass 函数。看起来 SubClass 的功能有效地隐藏了 BaseClass 的功能,即使它的签名不同。
有人可以解释一下吗?有没有办法通过 SubClass 实例调用 BaseClass 函数而不必转换它?
谢谢!
subclass' Func
方法将在成员名称查找中隐藏基础 class' Func
方法,因此将使用 any 数字参数,转换为整数。
如果您想在子class 中使用这两种方法,请使用using BaseClass::Func;
提取基础class'Func
方法。这会将基 Func
视为子 class 的成员,不再被子 class 的名称查找隐藏。
如您所说,BaseClass
的功能被SubClass
隐藏了。名称 Func
将在 SubClass
的范围内找到,然后名称查找停止,根本不会考虑 BaseClass
中的 Func
,即使它更合适。他们根本不是 "overloads"。
您可以使用 using
将它们引入相同的作用域以进行重载。
class SubClass : public BaseClass {
public:
using BaseClass::Func;
~~~~~~~~~~~~~~~~~~~~~
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};
鉴于以下...
#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() called!
但是,如果我将以下函数添加到 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() called!
与我预期的不同,我提供的浮点数被强制转换为整数,并调用了 SubClass 函数。看起来 SubClass 的功能有效地隐藏了 BaseClass 的功能,即使它的签名不同。
有人可以解释一下吗?有没有办法通过 SubClass 实例调用 BaseClass 函数而不必转换它?
谢谢!
subclass' Func
方法将在成员名称查找中隐藏基础 class' Func
方法,因此将使用 any 数字参数,转换为整数。
如果您想在子class 中使用这两种方法,请使用using BaseClass::Func;
提取基础class'Func
方法。这会将基 Func
视为子 class 的成员,不再被子 class 的名称查找隐藏。
如您所说,BaseClass
的功能被SubClass
隐藏了。名称 Func
将在 SubClass
的范围内找到,然后名称查找停止,根本不会考虑 BaseClass
中的 Func
,即使它更合适。他们根本不是 "overloads"。
您可以使用 using
将它们引入相同的作用域以进行重载。
class SubClass : public BaseClass {
public:
using BaseClass::Func;
~~~~~~~~~~~~~~~~~~~~~
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};