C ++容器如何与Liskov替换原则一起工作?

时间:2017-04-02 14:49:16

标签: c++ liskov-substitution-principle covariant covariant-return-types

对于返回类型, Liskov Substituiution Principle 需要返回值的协方差

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

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

然后工作班可以

class Base {
    virtual B& func();
};
class Derived : public Base {
    virtual D& func();
};

这符合 LSP ,因为返回类型是协变BaseDerived的层次结构是&#34 ; co"到BD)。

如果容器发挥作用怎么办?

class Base {
    virtual vector<B>& func();
};
class Derived : public Base {
    virtual vector<D>& func();
};

这仍然符合LSP吗?是vector<B>vector<D>&#34;协变&#34;到BaseDerived

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

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

1 个答案:

答案 0 :(得分:2)

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

就C ++类型系统而言,

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