Для типов возврата ковариации возвращаемых значений требуются Лисковский принцип замещения.
Предположим, что для возвращаемых типов используется небольшая иерархия типов:
class B {};
class D : public B {};
Тогда рабочие классы могли иметь
class Base {
virtual B& func();
};
class Derived : public Base {
virtual D& func();
};
и это будет соответствовать LSP потому что возвращаемые типы ковариант (иерархия Base
а также Derived
это «со», чтобы B
а также D
).
Что, если контейнеры войти в игру?
class Base {
virtual vector<B>& func();
};
class Derived : public Base {
virtual vector<D>& func();
};
Это все еще LSP-совместимый? Являются vector<B>
а также vector<D>
«ковариантный» для Base
а также Derived
?
Дополнительный вопрос: имеет ли значение для LSP, если я использую указатели в качестве типов контейнеров (с учетом динамического полиморфизма), т.е. vector<B*>
так далее?
Примечание: я пытался не полагаться на настоящие правила переопределения C ++, но в основном хотел понять LSP. Я не использовал ни override
Ключевое слово намеренно. Сначала я хочу понять LSP, затем я могу попробовать, если C ++ поддерживает эти правила.
vector<B>
а также vector<D>
два совершенно не связанных типа, поэтому он не совместим с LSP.
vector<B*>
а также vector<D*>
также два совершенно не связанных между собой типа, что касается системы типов C ++. поскольку B
это базовый класс D
Вы могли бы просто использовать vector<B*>
для обоих, и ковариация не будет тогда проблемой.
Других решений пока нет …