我试图在Visual Studio 2010中编译下一代码:
A {
public:
void f(int i) {cout << i;}
};
class B: public A {
public:
void f(string s) {cout << s;}
};
void main() {
A a;
B b;
a.f(1);
b.f("zazaza");
b.f(1); //Compilation fail
}
但是编译失败了。我无法理解为什么我不能从父类调用f(int)。我该怎么做才能解决这个问题?
答案 0 :(得分:6)
派生类中的void f(string);
隐藏了父的同名方法,而不是覆盖它。您可以在派生类中使用using
关键字来取消隐藏它。
class B: public A
{
public:
using A::f;
//^^^^^^^^^
void f(string s)
{
cout << s;
}
};
现在,两个f
方法都相互重载,f(int)
可用。
答案 1 :(得分:4)
当您在f(int i)
中使用相同名称定义另一个方法时,类A
中的B
会被隐藏。这就是为什么A::f(int i)
可以用A
对象调用,而不能用B
对象调用的原因。如果您想要overlaod,则两个方法应该与不同的方法签名在同一个类中。如果要override,基类方法将声明为virtual
,方法签名必须相同。
答案 2 :(得分:0)
因为您正在执行Method Hiding,而不是Method Overriding。 正如其他人所建议的,您需要在Parent类(void f(string);)中保留重载和虚拟方法,以便您可以覆盖它。