在C中重载子类中的方法

前端之家收集整理的这篇文章主要介绍了在C中重载子类中的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一些像这样的代码
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),那么两者都是可访问的,但同样,不是我想要的.

解决方法

名称查找在重载解析之前发生,因此一旦在Concrete中找到Foo,基类将不会搜索名为Foo的其他方法. Derived中的int Foo(int)由Foo in 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);
原文链接:https://www.f2er.com/c/110393.html

猜你在找的C&C++相关文章