C++中第二个接口类Callable是否需要虚析构函数?
Callable类是否需要虚析构函数?
结论:在你当前的代码场景下,不需要给Callable类添加虚析构函数。
原因分析:
你的代码里所有管理DerivedCallable对象的智能指针,都是从shared_ptr<Base>转换而来的,而Base类已经声明了虚析构函数。当shared_ptr释放对象时,会通过Base的虚析构函数触发完整的析构链,正确调用DerivedCallable的析构函数,完全不需要依赖Callable类的析构函数是否为虚函数。
比如你代码里的callableB,是通过dynamic_pointer_cast从shared_ptr<Base>转换得到的,它共享同一个控制块,析构逻辑依然由Base的虚析构主导,Callable有没有虚析构对对象的正确销毁没有影响。
什么时候需要给Callable加虚析构?
只有当你需要直接用Callable*或者shared_ptr<Callable>来管理DerivedCallable对象时(比如写Callable* p = new DerivedCallable; delete p;这类代码),才必须给Callable添加虚析构函数——否则通过基类指针删除派生类对象会触发未定义行为。但你的代码里完全没有这种使用方式,所以不需要。
内容的提问来源于stack exchange,提问作者Shout
相关产品推荐
相关产品推荐

