首页 > 解决方案 > C++ - 重写虚函数和多态性

问题描述

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

    class Parser{

       virtual Parsable parse() = 0;
    }

    class SpecialParser : public Parser{

       SpecialParsable parse() override; // implemented

    }

显然SpecialParsableclass 继承自Parsable.

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

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

提前致谢,

标签: c++overridingvirtualcovariance

解决方案


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

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

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

godbolt.org 上的实时示例


推荐阅读