C++中static_cast做派生类转基类为何会触发析构函数调用?
#include <iostream> using namespace std; #define debug(x) cout << #x << ": " << (x) << endl; class Base { public: void f() { cout << "Base:f()" << endl; } ~Base() { cout << "Base:~Base()" << endl; } }; class A : public Base { public: ~A() { cout << "A:~A()" << endl; } }; int main() { { A a; static_cast<Base>(a); } return 0; }
原因解释
核心原因是你用static_cast转换的是值类型而非引用/指针类型,会生成临时的Base类对象,额外触发一次析构。
完整执行流程如下:
- 进入内部局部作用域,构造A类型对象
a:先调用编译器自动生成的Base默认构造函数(无输出),再调用编译器自动生成的A默认构造函数(无输出) - 执行
static_cast<Base>(a):因为目标类型是Base的值类型,会触发对象切片,调用Base的拷贝构造函数,将a中包含的Base子对象拷贝一份,生成一个临时的Base对象。该临时对象在当前表达式执行结束后立即销毁,调用第一次Base析构函数,输出Base:~Base() - 离开内部局部作用域,销毁局部变量
a:先调用A的析构函数,输出A:~A(),再自动调用基类Base的析构函数,输出第二次Base:~Base() - 程序执行结束返回
补充说明
如果你将转换目标改为Base的引用类型static_cast<Base&>(a),不会生成临时对象,就只会触发一次Base析构,符合预期。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

