可能重复:
为什么派生类中的重写函数隐藏基类的其他重载?
基类中的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';
}
这是函数隐藏的经典示例
C++中的重载解析不能跨类工作,派生类中的函数隐藏基类中所有名称相同的函数。编译器只在派生类对象的派生类中看到函数。
通过使用using Declaration,可以取消隐藏派生类的所有基类函数在派生类中。
添加,
using B::f;
在派生类中,将使派生类对象能够访问基类中名称为f()
的所有函数,就好像它们是派生类中的重载函数一样。
这应该是一个很好的阅读:
警告的含义是什么:派生::f(char(隐藏基::f(double(
我认为,如果给派生类一个与基类中存在的函数同名的函数,则派生类的"function"将隐藏基类的"functions"。如果您只是想重载,请使用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';
}