对于返回类型,Liskov替换原理要求返回值具有协方差。
让我们假设返回类型的小型类型层次结构:
class B {};
class D : public B {};
worker 类(Class)可能会
class Base {
virtual B& func();
};
class Derived : public Base {
virtual D& func();
};
并且这将符合LSP,因为返回类型是协变的(
Base
和Derived
的层次结构与B
和D
“co”)。如果容器起作用了怎么办?
class Base {
virtual vector<B>& func();
};
class Derived : public Base {
virtual vector<D>& func();
};
这仍然符合LSP吗?
vector<B>
和vector<D>
与Base
和Derived
是否“协变”?附加问题:如果我使用指针作为容器类型(允许动态多态),即
vector<B*>
等,对LSP会有影响吗?注意:我试图不依赖真实的C++覆盖规则,但主要是想了解LSP。我也没有故意使用
override
关键字。首先,我想了解LSP,然后尝试C++是否支持这些规则。 最佳答案
vector<B>
和vector<D>
是两种完全不相关的类型,因此不符合LSP。
就C++类型系统而言,vector<B*>
和vector<D*>
也是两个完全不相关的类型。由于B
是D
的基类,因此您可以只对这两者使用vector<B*>
,而协方差就不会成为问题。
关于c++ - C++容器如何与Liskov替代原理一起工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43169693/