对于返回类型,Liskov替换原理要求返回值具有协方差。

让我们假设返回类型的小型类型层次结构:

class B {};
class D : public B {};

worker 类(Class)可能会
class Base {
    virtual B& func();
};
class Derived : public Base {
    virtual D& func();
};

并且这将符合LSP,因为返回类型是协变的(BaseDerived的层次结构与BD“co”)。

如果容器起作用了怎么办?
class Base {
    virtual vector<B>& func();
};
class Derived : public Base {
    virtual vector<D>& func();
};

这仍然符合LSP吗? vector<B>vector<D>BaseDerived是否“协变”?

附加问题:如果我使用指针作为容器类型(允许动态多态),即vector<B*>等,对LSP会有影响吗?

注意:我试图不依赖真实的C++覆盖规则,但主要是想了解LSP。我也没有故意使用override关键字。首先,我想了解LSP,然后尝试C++是否支持这些规则。

最佳答案

vector<B>vector<D>是两种完全不相关的类型,因此不符合LSP。

就C++类型系统而言,vector<B*>vector<D*>也是两个完全不相关的类型。由于BD的基类,因此您可以只对这两者使用vector<B*>,而协方差就不会成为问题。

关于c++ - C++容器如何与Liskov替代原理一起工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43169693/

10-11 19:37
查看更多