可能重复:
Why does an overridden function in the derived class hide other overloads of the base class?
基类中的f(int)是否在派生的派生类D中继承? 如果是,那么为什么超载在这里不起作用。 如果没有那么为什么f(int)不被继承,因为类d是公开派生的。 我很困惑。
class B {
public:
int f(int i) { cout << "f(int): "; return i+1; }
// ...
};
class D : public B {
public:
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};
int main()
{
D* pd = new D;
cout << pd->f(2) << '\n';
cout << pd->f(2.3) << '\n';
}
答案 0 :(得分:6)
这是隐藏功能的经典示例 C ++中的重载决策不适用于各种类,派生类中的函数隐藏 所有 Base类中具有相同名称的函数。编译器只在派生类中查看派生类对象的函数。
您可以在derive类中使用使用声明。 取消隐藏 所有派生类的基类函数。
添加,
using B::f;
派生类中的将使派生类对象能够访问Base类中名为f()
的所有函数,就好像它们是派生类中的重载函数一样。
这应该是一个很好的阅读:
<强> What's the meaning of, Warning: Derived::f(char) hides Base::f(double)? 强>
答案 1 :(得分:4)
我认为如果给派生类一个与基类中存在的函数同名的函数,派生类'函数将隐藏基类的函数。如果您只想过载,请使用using
关键字。
class B {
public:
int f(int i) { cout << "f(int): "; return i+1; }
// ...
};
class D : public B {
public:
using B::f; //brings in all of B's "f" functions
//making them equals of D's "f" functions.
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};
int main()
{
D* pd = new D;
cout << pd->f(2) << '\n';
cout << pd->f(2.3) << '\n';
}