C++隐式声明的基类析构函数是否为virtual?继承需声明虚析构函数吗
C++隐式析构函数与虚析构函数问题解答
首先你给出的示例代码如下:
struct B {}; struct D : B {};
隐式声明的B::~B()是否为virtual
答案是否定的,该示例中B的隐式析构函数不是virtual。
C++中类的析构函数只有满足以下任意一个条件才会具备virtual属性:
- 开发者手动为该类显式声明了virtual修饰的析构函数
- 该类的直接或间接基类已经存在虚析构函数,派生类的析构函数会自动隐式携带virtual属性
你示例中的B没有基类,也没有手动声明虚析构函数,因此其隐式生成的析构函数为非虚函数,此时如果通过B*类型的指针删除D类型的对象,就会触发未定义行为:
通过基类指针删除对象会触发未定义行为,除非基类中的析构函数是virtual
使用继承时是否需要始终声明虚析构函数
不需要,是否需要为基类提供虚析构函数完全取决于实际使用场景:
- 如果你设计的类是作为多态基类使用,业务中存在通过基类指针/引用持有派生类对象、且会通过基类指针释放派生类对象的逻辑,此时必须为基类声明虚析构函数,避免内存泄漏、资源未正确释放等未定义行为。
- 如果你的类虽然允许被继承,但不会出现通过基类指针释放派生类对象的操作,或者类本身不是设计为多态基类使用,就不需要额外声明虚析构函数。额外添加虚析构函数会为类引入虚函数表指针,增加对象的内存开销,还会使类失去平凡(trivial)属性,影响
memcpy等底层操作的兼容性。
内容的提问来源于stack exchange,提问作者mfnx
相关产品推荐
相关产品推荐

