对于返回类型, Liskov Substituiution Principle 需要返回值的协方差。
让我们假设返回类型的小型层次结构:
class B {};
class D : public B {};
然后工作班可以
class Base {
virtual B& func();
};
class Derived : public Base {
virtual D& func();
};
这符合 LSP ,因为返回类型是协变(Base
和Derived
的层次结构是&#34 ; co"到B
和D
)。
如果容器发挥作用怎么办?
class Base {
virtual vector<B>& func();
};
class Derived : public Base {
virtual vector<D>& func();
};
这仍然符合LSP吗?是vector<B>
和vector<D>
&#34;协变&#34;到Base
和Derived
?
附加问题:如果我使用指针作为容器类型(允许动态多态性),即vector<B*>
等,它会对LSP产生影响吗?
注意:我尽量不依赖真正的C ++覆盖规则,但主要是想了解LSP。我故意没有使用override
关键字。首先,我想了解LSP,然后我可以试试C ++是否支持这些规则。
答案 0 :(得分:2)
vector<B>
和vector<D>
是两个完全不相关的类型,因此它不符合LSP。
vector<B*>
和vector<D*>
也是两个完全不相关的类型。由于B
是D
的基类,因此您可以只使用vector<B*>
,因此协方差不会成为问题。