写出下面程序的输出:
class Base
{
public:
virtual void print(int a) { cout << "Base print int " << a << endl; }
virtual void print(char a) { cout << "Base print char " << a << endl; }
virtual void print(double a) { cout << "Base print double " << a << endl; }
};
class Derived :public Base
{
public:
void print(int a) { cout << "Derived print int" << a << endl; }
};
int main()
{
Derived d;
d.print(10);
d.print(5.2);
d.print('a');
}
从结果中可以看出,调用的全部都是子类的print函数,这是因为C++中存在名字隐藏,所谓名字隐藏,是指父类中有一组重载函数,子类在继承父类时如果覆盖了这组重载函数中的任意一个,则其余没有被覆盖的同名函数在子类中是不可见的。
解决办法:
1.不使用函数覆盖,子类的方法起一个不同的名字
2.子类覆盖父类中所有的重载方法