如果我从类继承,C++ 中的基类应该至少有一个
virtual
析构函数。因此,人们应该例如最好不要继承自std::optional
。
这里的答案说
如果它没有任何虚拟方法,那么您不应该将其用作基础。这排除了 std::vector 等。
如果我不能安全地继承
std::optional
或std::vector
,我希望它们是final
。听起来这个关键字就是为了这个目的而创建的。
指定 [...] 不能从中派生类。
如果我们忽略这个建议,那么当从这样的类派生时,似乎会得到未定义的行为。 甚至还有
核心准则 C.139并非每个类都应该是基类。大多数标准库类都是这样的示例(例如,std::vector 和 std::string 并非设计为派生自)。恕我直言,在此类课程上使用
final
可以防止出现问题。
对于哪种场景我需要std::
类的非最终性?
std::vector
这样的类作为基类是完全可以的。
您只需要知道从没有虚拟析构函数的类派生意味着什么,即您无法通过基类引用/指针将所有权传递给它。并且您必须了解如果标准库扩展或更改类的接口,特别是公共继承意味着什么。
否则就没有 UB 或任何禁止使用标准库类作为基类的东西。
所有这些都适用于任何其他没有虚拟析构函数的类。