C++:调用了错误的析构函数
C++: Wrong Destructor Called
Projectile
是 Node
的子类。我希望调用Projectile
析构函数。
注意:在现实生活中,我有一个Node*
列表,它们是Projectile
、Player
或Enemy
,每个都有自己的析构函数。
Node
在.h file
中没有指定的析构函数(我假设它使用默认析构函数)。
Node* p = new Projectile();
delete(p); //Projectile destructor is never called
首先,从你的问题中似乎很清楚Projectile
是Node
的一个子类(参见这个维基百科条目)。
如果你有一个像Node
这样的类是为子类而构建的,那么你应该确保它的析构函数是虚拟的:
class Node
{
...
virtual ~Node();
};
这将导致编译器调用相应的类s destructor when you
删除指向超类的指针。
(另一个问题是它是否应该是纯虚拟的。
>C++是静态类型语言,因此从此语句Node* p = new Projectile();
编译器将p视为Node的对象。在析构 p 时,它将仅调用类 Node
的析构函数。
为了克服这种情况,virtual
出现了。
法典:
class Node {
public:
virtual ~Node() {
//delete resources allocated in Node class
}
};
class Projectile : public Node {
public:
~Projectile() {
//delete resources allocated in Projectile class
}
};
使Node
的析构函数virtual
,默认的析构函数(非虚拟)不能满足这里的需求,即动态多态性不起作用。
class Node {
public:
virtual ~Node() {}
}
简短回答:
使您的析构函数Node
虚拟。
class Node {
// Stuff...
virtual ~Node();
};
不那么简短的答案:
当Projectile
和喜欢继承Node
时,数据成员和函数继承自Node
。派生类可以重写或替换父类中的实际函数定义。此重写发生在编译时或运行时,具体取决于天气,基类中的函数被声明为"虚拟"。
对于非虚拟析构函数,要调用的析构函数由指针的类型确定。所以即使指针变量p
指向Projectile
的实例,delete(p)
也会调用Node
中定义的析构函数。
,要调用的析构函数是在运行时确定的。因此,无论指针类型如何,调用的析构函数都将是在 p
指向的对象中定义的析构函数。
- 不命名构造函数和析构函数上的类型错误
- 导致 Seg 错误的 SingleLinkedList 的析构函数
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 矢量擦除调用的错误析构函数
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 导致堆缓冲区错误的动态分配数组的析构函数
- Qt C++析构函数错误
- C++ 链接列表队列实现和析构函数错误:"Aborted (Core Dumped)"
- 使用此指针时出现C++析构函数错误的原因
- 是否有某种方法可以检测是否使用非虚拟基析构函数错误地删除了类
- 类析构函数错误
- 析构函数错误
- C++动态数组析构函数错误
- c++中对析构函数错误的未定义引用
- 字符数组的析构函数错误
- C++复制构造函数、析构函数错误等
- 无法退出,因为析构函数错误导致main()在退出时停止执行
- 映射析构函数错误
- c++析构函数错误