lsp — Как контейнеры C ++ работают вместе с принципом подстановки Лискова?

Для типов возврата ковариации возвращаемых значений требуются Лисковский принцип замещения.

Предположим, что для возвращаемых типов используется небольшая иерархия типов:

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 ++ поддерживает эти правила.

1

Решение

vector<B> а также vector<D> два совершенно не связанных типа, поэтому он не совместим с LSP.

vector<B*> а также vector<D*> также два совершенно не связанных между собой типа, что касается системы типов C ++. поскольку B это базовый класс DВы могли бы просто использовать vector<B*> для обоих, и ковариация не будет тогда проблемой.

2

Другие решения

Других решений пока нет …