标准库中非final非虚类(如std::系列类)的适用场景探讨
标准库中非final非虚类(如std::系列类)的适用场景探讨
作为和C标准库朝夕相处的开发者,我一直有个困惑:咱们都清楚,C里如果要安全地继承一个类,这个基类至少得有个虚析构函数。就拿std::optional来说,官方明确不建议继承它,std::vector这类容器也是如此——有个经典的说法:
如果一个类没有任何虚方法,那它就不应该被当作基类使用,这直接把std::vector这类标准库类排除在外了。
既然从std::optional或std::vector继承完全不安全,我总觉得它们应该被标记成final。毕竟final关键字的定义就是:
指定一个类不能被继承。
这不就是为这种“天生不能当基类”的类量身定做的吗?
而且要是硬不听劝,非要继承这类没有虚方法的标准库类,后果会直接触发未定义行为,这可是C++里的大忌。
后来我翻到了C++核心准则的C.139:谨慎使用final标记类。这条准则里也验证了我的部分想法:
不是所有类都天生要做基类,标准库的绝大多数类都是典型例子(比如std::vector和std::string,从设计之初就没打算被继承)。
可我还是搞不懂:既然这些类从根上就不该被继承,为啥不干脆用final把继承的路彻底封死?到底存在什么场景,需要保留它们“可被继承”的特性呢?
备注:内容来源于stack exchange,提问作者Thomas W.
相关产品推荐
相关产品推荐

