Syn*_*dog 2 c++ inheritance overloading shadowing
鉴于以下...
#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;
}
Run Code Online (Sandbox Code Playgroud)
这几乎和人们预期的一样运行,导致以下输出......
BaseClass:Func() 调用!
但是,如果我将以下函数添加到 SubClass ...
class SubClass : public BaseClass {
public:
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};
Run Code Online (Sandbox Code Playgroud)
像任何其他重载一样,如果我提供一个 int 作为我的参数,我希望 SubClass 函数被调用,如果我提供一个浮点数,我希望调用 BaseClass 函数。但是,如果我按原样运行程序(即使用浮点数),则情况并非如此......
SubClass::Func() 调用!
我提供的浮点数不是我所期望的,而是转换为整数,然后调用 SubClass 函数。似乎 SubClass 的函数有效地掩盖了 BaseClass 的函数,即使它的签名不同。
有人可以对此有所了解吗?有没有办法通过 SubClass 实例调用 BaseClass 函数而不必强制转换?
谢谢!
正如你所说,BaseClass's 的功能被 's 隐藏了SubClass。名称Func将在SubClass的范围内找到,然后名称查找停止,FuncinBaseClass根本不会被考虑,即使它更合适。它们根本不是“超载”。
请参阅非限定名称查找。
您可以使用using将它们引入到相同的作用域中以使重载起作用。
class SubClass : public BaseClass {
public:
using BaseClass::Func;
~~~~~~~~~~~~~~~~~~~~~
void Func(int i) { // accepts an int, not a float!
cout << "SubClass::Func() called!";
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |