在C ++中重载子类中的方法

时间:2009-11-14 17:13:46

标签: c++ inheritance overloading

假设我有一些这样的代码:

class Base {
    public:
      virtual int Foo(int) = 0;
};

class Derived : public Base {
    public:
      int Foo(int);
      virtual double Foo(double) = 0;
};

class Concrete : public Derived {
    public:          
      double Foo(double);
};

如果我有一个Concrete类型的对象,为什么我不能调用Foo(int)?
如果我更改了Foo的名称(double)以便它不会重载Foo,那么一切都很好并且两种方法都可以访问,但这不是我想要的。
类似地,如果我在Derived中删除Concrete类并实现Foo(double),那么两者都是可访问的,但同样不是我想要的。

2 个答案:

答案 0 :(得分:17)

名称查找在重载解析之前发生,因此在Foo中找到Concrete后,基类将不会搜索名为Foo的其他方法。 int Foo(int)中的Derived隐藏了Foo中的Concrete

您有很多选择。

将通话更改为显式。

concrete.Derived::Foo(an_int);

向Concrete添加using声明。

class Concrete : public Derived {
public:          
   using Derived::Foo;
   double Foo(double);
};

通过基准参考调用该函数。

Derived& dref = concrete;
dref.Foo(an_int);

答案 1 :(得分:6)

Foo(double)隐藏了你的基地的功能。你可以看到它:

class Concrete : public Derived 
{
public:          
  using Derived::Foo;
  double Foo(double);
};