c++ - C++ 容器如何与里氏替换原则一起工作?

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

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

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

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

worker 类(Class)可以拥有

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

这将符合LSP,因为返回类型是协变(BaseDerived的层次结构是“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++是否支持这些规则。

最佳答案

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

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

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

相关文章:

c# - 协变泛型参数

java - abstract class A<T extends A>有没有更好的解决方案?

c++ - 将变量发送到 void 指针或 C++ 中的 void 指针引用

oop - 类型 - 子类型关系。似乎有些不清楚

c++ - 有没有办法查询消息过滤器是否已经生效?

java - 使用策略模式避免向下转型

c++ - 为什么函数指针会破坏可替换性而 std::function 不会?

c++ - 虚函数的不同返回类型

c++ - 使用 cvShowImage() 显示滞后视频

c++ - 使用 -1 将所有位设置为真是否安全?