【问题标题】:C++ - Override virtual function and polymorphismC++ - 重写虚函数和多态性
【发布时间】:2019-11-17 20:10:53
【问题描述】:

我想我没有得到关于虚拟行为的非常基本的概念。 我想创建以下层次结构:

    class Parser{

       virtual Parsable parse() = 0;
    }

    class SpecialParser : public Parser{

       SpecialParsable parse() override; // implemented

    }

显然SpecialParsable 类继承自Parsable

由于签名不同,这会返回一个错误。 (SpecialParser::parse() returns SpecialParsable instead of Parsable).

现在,Parsable 显然是一个抽象类,我不想让它被实例化。我不明白为什么不能这样做,因为 SpecialParsable 只是 Parsable 的特定实现。

提前致谢,

【问题讨论】:

  • 它们需要返回相同的类型。
  • 请参阅this thread 了解如何返回对象。而对于不同的返回类型,SpecialParsable必须继承自Parseable,但我猜是这样的吧?!

标签: c++ overriding virtual covariance


【解决方案1】:

C++ 中的动态多态性依赖于间接。如果您返回一个指针(或引用),您的示例将按预期编译和运行。这称为“协变返回类型”:

class Parser {
   virtual Parsable* parse() = 0;
};

class SpecialParser : public Parser {
   SpecialParsable* parse() override; // implemented
};

live example on godbolt.org

【讨论】:

  • 有可行的理由这样做吗?我的意思是,如果您从基类指针/引用调用parse(),那么您无论如何都不知道“真实”返回类型。如果你直接从派生类调用它,那为什么要虚拟呢?或者如果它是虚拟的,出于其他原因,那么在返回的指针上添加static_cast 应该更简单...
  • @sklott:一旦你知道了类,协方差允许使用最专业的类。从Parser,你只得到Parsable,但从SpecialParser,你可能可以从SpecialParsable获得额外的功能,或者限制自己使用Parsable接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2010-10-01
相关资源
最近更新 更多