【发布时间】:2021-06-18 14:47:40
【问题描述】:
考虑抽象类AbstractMap,它是子类MyMap。执行以下删除操作是否安全?或者,我应该仅在重新投射到 MyMap 后删除 ptr 吗?为什么?我猜这是不安全的,因为在这种情况下MyMap 的析构函数没有被调用。
AbstractMap* ptr;
ptr = static_cast<AbstractMap*>(new MyMap());
delete ptr;
past question 谈到要转换为 void* 案例,但我不确定我的案例。
【问题讨论】:
-
这取决于
AbstractMap是否准备好进行多态性。 (即它的析构函数是否被标记为虚拟) -
仅当
AbstractMap具有虚拟析构函数时才允许。如果不是,则程序的行为未定义。 -
在所描述的情况下不需要 static_cast。
-
@PeteBecker 谢谢!假设
AbstractMap有一个虚析构函数,怎么调用子类的析构函数?我的意思是,假设我们还有很多AbstractMap的子类,它怎么知道“原始”类是MyMap? -
这就是
virtual的魔力。在所有情况下都会调用正确版本的函数。在幕后,这通常使用a "vtable" 实现。
标签: c++ pointers dynamic-cast static-cast