【问题标题】:Why static_cast make the destructor called为什么 static_cast 调用析构函数
【发布时间】:2021-10-15 10:02:27
【问题描述】:
#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 将 A 转换为 Base, 输出告诉我它调用~Base() 两次? 为什么static_cast 会调用析构函数?

【问题讨论】:

  • 你可能想要static_cast&lt;Base&amp;&gt;(a);
  • 你不能改变事物的类型。转换,无论是否显式,都不会真正将对象转换为不同的类型;它会根据您转换的内容创建具有目标类型的新内容。

标签: c++ static-cast


【解决方案1】:

static_cast&lt;Base&gt;(a); 构造一个临时的Base,它是从a 复制而来的。在临时的完整表达式被销毁后,Base 的析构函数被调用。

之后,当超出范围a被销毁时,依次调用ABase的析构函数。请注意,这与static_cast 无关。

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 2014-03-05
    • 2018-05-24
    • 2015-08-21
    • 2021-04-01
    • 1970-01-01
    • 2020-08-01
    • 2021-11-06
    相关资源
    最近更新 更多