【发布时间】:2017-08-27 10:30:42
【问题描述】:
对于返回类型的协方差,Liskov 替换原则要求返回值。
让我们假设返回类型的小类型层次结构:
class B {};
class D : public B {};
那时工人阶级可以拥有
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++ 是否支持这些规则。
【问题讨论】:
标签: c++ liskov-substitution-principle covariant covariant-return-types