像 std::-classes 这样的非最终非虚拟类在什么情况下有用?

问题描述 投票:0回答:1

如果我从类继承,C++ 中的基类应该至少有一个

virtual
析构函数。因此,人们应该例如最好不要继承自
std::optional

这里的答案

如果它没有任何虚拟方法,那么您不应该将其用作基础。这排除了 std::vector 等。

如果我不能安全地继承

std::optional
std::vector
,我希望它们是
final
。听起来这个关键字就是为了这个目的而创建的。

指定 [...] 不能从中派生类。

如果我们忽略这个建议,那么当从这样的类派生时,似乎会得到未定义的行为。 甚至还有

核心准则 C.139

,“在类上谨慎使用 Final”。该指南证实了:

并非每个类都应该是基类。大多数标准库类都是这样的示例(例如,std::vector 和 std::string 并非设计为派生自)。

恕我直言,在此类课程上使用
final

可以防止出现问题。

对于哪种场景我需要

std::类的非最终性?


    
	

c++ inheritance final
1个回答
0
投票
std::vector

这样的类作为基类是完全可以的。

您只需要知道从没有虚拟析构函数的类派生意味着什么,即您无法通过基类引用/指针将所有权传递给它。

并且您必须了解如果标准库扩展或更改类的接口,特别是公共继承意味着什么。

否则就没有 UB 或任何禁止使用标准库类作为基类的东西。

所有这些都适用于任何其他没有虚拟析构函数的类。

© www.soinside.com 2019 - 2024. All rights reserved.