C ++ - переопределить виртуальную функцию и полиморфизм - PullRequest
1 голос
/ 08 июля 2019

Я думаю, что у меня нет какой-то базовой концепции виртуального поведения.Я хочу создать следующую иерархию:

    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.

Заранее спасибо,

1 Ответ

4 голосов
/ 08 июля 2019

Динамический полиморфизм в C ++ зависит от косвенности.Если вы вернете указатель (или ссылку), ваш пример скомпилируется и будет работать так, как ожидается.Это называется «ковариантный тип возврата»:

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

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

живой пример на godbolt.org

...