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" 到 B
和 D
).
如果容器发挥作用怎么办?
class Base {
virtual vector<B>& func();
};
class Derived : public Base {
virtual vector<D>& func();
};
这仍然符合 LSP 标准吗? vector<B>
和vector<D>
是"covariant"到Base
和Derived
吗?
附加问题:如果我使用指针作为容器类型(允许动态多态性),即 vector<B*>
等,它对 LSP 有影响吗?
注意:我尽量不依赖真正的 C++ 覆盖规则,而是主要想了解 LSP。我也没有故意使用 override
关键字。首先我想了解 LSP 然后我可以试试 C++ 是否支持这些规则。
vector<B>
和vector<D>
是两个完全不相关的类型,所以不符合LSP。
vector<B*>
和vector<D*>
对于C++类型系统来说也是两个完全不相关的类型。由于 B
是 D
的基数 class,您可以对两者都使用 vector<B*>
,这样协方差就不是问题了。
对于 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" 到 B
和 D
).
如果容器发挥作用怎么办?
class Base {
virtual vector<B>& func();
};
class Derived : public Base {
virtual vector<D>& func();
};
这仍然符合 LSP 标准吗? vector<B>
和vector<D>
是"covariant"到Base
和Derived
吗?
附加问题:如果我使用指针作为容器类型(允许动态多态性),即 vector<B*>
等,它对 LSP 有影响吗?
注意:我尽量不依赖真正的 C++ 覆盖规则,而是主要想了解 LSP。我也没有故意使用 override
关键字。首先我想了解 LSP 然后我可以试试 C++ 是否支持这些规则。
vector<B>
和vector<D>
是两个完全不相关的类型,所以不符合LSP。
vector<B*>
和vector<D*>
对于C++类型系统来说也是两个完全不相关的类型。由于 B
是 D
的基数 class,您可以对两者都使用 vector<B*>
,这样协方差就不是问题了。