从派生类调用重载函数。

时间:2014-05-14 06:03:52

标签: c++ polymorphism

我试图在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)。我该怎么做才能解决这个问题?

3 个答案:

答案 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);)中保留重载虚拟方法,以便您可以覆盖它。