You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:18:03