关于《C++ Primer》中基类虚析构函数规则的疑问
关于《C++ Primer》基类虚析构函数表述的疑问解答
首先要明确:基类析构函数需要设为虚函数的核心前提是这个基类会被用于多态场景——也就是会通过基类指针/智能指针指向派生类对象,并且通过基类指针释放该对象。
《C++ Primer》用“几乎总是”而非“必须始终”,是因为存在不需要虚析构函数的基类场景:
- 基类被设计为不可继承:比如用
final关键字修饰类,或者把构造函数设为私有(比如单例类),这种情况下不会有派生类存在,自然不存在多态销毁的需求,不需要虚析构函数。 - 基类明确不参与多态:有些基类只是用来做数据封装或提供工具方法,设计上就只允许直接实例化,不会被继承。这种场景下加虚析构函数反而会带来不必要的开销——对象会多一个虚表指针占用内存,析构调用也会有间接跳转的性能损耗。
你提到的std::unique_ptr<Base> derived(new Derived);属于典型的多态销毁场景,这种情况下基类必须有虚析构函数,否则确实会触发未定义行为。但《C++ Primer》的表述是从所有基类的使用场景出发,“几乎总是”既覆盖了绝大多数需要继承的多态场景(毕竟设计继承体系的根类大多是为了多态),也给非多态的基类场景留出了合理的例外空间。
新手初期可能只接触到多态相关的继承场景,所以会觉得应该用“必须始终”,但随着对C++设计的理解深入,就能明白这种表述的严谨性。
内容的提问来源于stack exchange,提问作者Autechre
相关产品推荐
相关产品推荐

