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

How do C++ containers work together with the Liskov Substitution Principle?

对于 return 类型 return 值的协方差Liskov 替换原则 所要求的。

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

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

工作类然后可以有

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

这将符合 LSP 因为 return 类型是 covariant([=13 的层次结构=] 和 Derived 是 "co" 到 BD).

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

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

这仍然符合 LSP 标准吗? vector<B>vector<D>是"covariant"到BaseDerived吗?

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

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

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

vector<B*>vector<D*>对于C++类型系统来说也是两个完全不相关的类型。由于 BD 的基数 class,您可以对两者都使用 vector<B*>,这样协方差就不是问题了。