Недопустимый ковариантный тип возврата в переопределенных методах со ссылочными типами возврата - PullRequest
0 голосов
/ 11 декабря 2019

Я реализую наследование с помощью языка PIMPL. У меня есть два класса, таких как:

// In Base.h
class Base
{
  virtual BaseImpl& getImpl() const;
private:
  std::unique_ptr<BaseImpl> _pImpl;
};

// In Derived.h
class Derived : public Base
{
  DerivedImpl& getImpl() const /* override */;
};

// In BaseImpl.h
class BaseImpl { ... };

// In DerivedImpl.h
class DerivedImpl : public BaseImpl { ... };

Теперь, если я раскомментирую ключевое слово override выше, компилятор жалуется, что ковариантный тип возвращаемого значения недопустим при переопределении getImpl().

, поскольку DerivedImpl происходит от BaseImpl, и я возвращаю ссылки, где здесь проблема с ковариацией?

ПРИМЕЧАНИЕ : этот образец кода добровольно не отсортирован, классы находятся в независимых файлах. Проблема только в ключевом слове override. Код компилируется без него.

1 Ответ

2 голосов
/ 11 декабря 2019

Поскольку DerivedImpl является производным от BaseImpl, и я возвращаю ссылки, где здесь проблема с ковариацией?

Проблема заключается в том, что компилятор не может предсказать, будет ли DerivedImpl получаться из BaseImpl или не. Это еще не известно, потому что DerivedImpl еще не определено в точке, где была объявлена ​​переопределенная функция. Это можно решить, переупорядочив определения:

class BaseImpl {  };
class DerivedImpl : public BaseImpl {  };

class Derived : public Base
{
  DerivedImpl& getImpl() const override ;
};

Если вы не можете сделать определение возвращаемого типа видимым в точке объявления функции, то вы не можете использовать ковариантный возвращаемый тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...