2

对于返回类型,里氏替换原则要求返回值的协方差

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

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

那时的工人阶级可以

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

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

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

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++ 是否支持这些规则。

4

1 回答 1

2

vector<B>并且vector<D>是两个完全不相关的类型,所以它不符合 LSP。

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

于 2017-04-02T15:07:19.167 回答