对于返回类型,里氏替换原理要求返回值的协方差。
让我们假设返回类型的小型类型层次结构:
class B {};
class D : public B {};
worker 类(Class)可以拥有
class Base {
virtual B& func();
};
class Derived : public Base {
virtual D& func();
};
这将符合LSP,因为返回类型是协变(Base
和Derived
的层次结构是“co”到B
和 D
)。
如果容器发挥作用怎么办?
class Base {
virtual vector<B>& func();
};
class Derived : public Base {
virtual vector<D>& func();
};
这仍然符合 LSP 规定吗?是vector<B>
和vector<D>
“协变”为Base
和Derived
?
附加问题:如果我使用指针作为容器类型(允许动态多态性),即vector<B*>
,这对LSP有什么影响吗?等等?
注意:我尝试不依赖真正的 C++ 覆盖规则,但主要是想了解 LSP。我也没有使用override
故意使用关键字。首先我想了解LSP,然后我可以尝试C++是否支持这些规则。
最佳答案
vector<B>
和vector<D>
是两种完全不相关的类型,因此不符合LSP。
vector<B*>
和vector<D*>
就 C++ 类型系统而言,也是两个完全不相关的类型。自 B
是 D
的基类,你可以使用vector<B*>
对于两者来说,协方差就不会成为问题。
关于c++ - C++ 容器如何与里氏替换原则一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43169693/