【问题标题】:Overloading a method in a subclass in C++在 C++ 中重载子类中的方法
【发布时间】:2010-12-16 15:12:42
【问题描述】:

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

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);
};

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

【问题讨论】:

  • 我不明白这个问题。 GCC 版本 3.3.6 和 4.2.4 都可以毫无怨言地编译此代码。
  • 由于整数到双精度的隐式转换 - 尝试向函数添加跟踪并执行 Concrete c; int i=1; c.Foo(i);
  • 在子类中重新定义虚方法不叫覆盖吗?

标签: c++ inheritance overloading


【解决方案1】:

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

你有很多选择。

将调用更改为显式。

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);

【讨论】:

    【解决方案2】:

    Foo(double) 对你的基础隐藏函数。你可以让它可见:

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

    【讨论】:

    猜你喜欢
    • 2016-03-11
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2010-12-05
    • 2021-06-07
    相关资源
    最近更新 更多