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
你得把Node
的析构函数改成virtual
,这里默认的(非虚)不能满足需求,即动态多态不行。
class Node {
public:
virtual ~Node() {}
}
首先,从你的问题中可以很清楚地看出 Projectile
是 Node
的 subclass(参见 this Wikipedia entry).
如果你有一个像 Node
这样的 class 是为 subclassing 构建的,那么你应该确保它的析构函数是虚拟的:
class Node
{
...
virtual ~Node();
};
这将导致编译器调用适当的 classs destructor when you
delete` 指向 superclass.
的指针
(另外一个问题是是否应该是纯虚的。)
C++ 是静态类型语言,所以从这条语句 Node* p = new Projectile();
编译器将 p 视为 Node 的对象。在析构 p 时,它只会调用 class 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
虚拟中创建你的析构函数。
class Node {
// Stuff...
virtual ~Node();
};
不那么简短的回答:
当 Projectile
和类似的继承 Node
时,数据成员和函数从 Node
继承。派生 class 可以覆盖或替换父 class 中的实际函数定义。这种覆盖发生在编译时或 运行 时,具体取决于天气,基 class 中的函数被声明为 'virtual'.
在非虚析构函数的情况下,要调用的析构函数由指针的类型决定。因此,即使指针变量 p
指向 Projectile
的实例,delete(p)
也会调用 Node
.
中定义的析构函数
如果是虚拟析构函数,要调用的析构函数在运行时确定。因此,无论指针类型如何,被调用的析构函数都是在 p
.
指向的对象中定义的析构函数
Projectile
是 Node
的子类。
我想要调用 Projectile
析构函数。
注意:在现实生活中,我有一个 Node*
的列表,它们是 Projectile
、Player
或 Enemy
,每个都有自己的析构函数。
Node
在 .h file
中没有指定的析构函数(我假设它使用默认的析构函数。)
Node* p = new Projectile();
delete(p); //Projectile destructor is never called
你得把Node
的析构函数改成virtual
,这里默认的(非虚)不能满足需求,即动态多态不行。
class Node {
public:
virtual ~Node() {}
}
首先,从你的问题中可以很清楚地看出 Projectile
是 Node
的 subclass(参见 this Wikipedia entry).
如果你有一个像 Node
这样的 class 是为 subclassing 构建的,那么你应该确保它的析构函数是虚拟的:
class Node
{
...
virtual ~Node();
};
这将导致编译器调用适当的 classs destructor when you
delete` 指向 superclass.
(另外一个问题是是否应该是纯虚的。)
C++ 是静态类型语言,所以从这条语句 Node* p = new Projectile();
编译器将 p 视为 Node 的对象。在析构 p 时,它只会调用 class 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
虚拟中创建你的析构函数。
class Node {
// Stuff...
virtual ~Node();
};
不那么简短的回答:
当 Projectile
和类似的继承 Node
时,数据成员和函数从 Node
继承。派生 class 可以覆盖或替换父 class 中的实际函数定义。这种覆盖发生在编译时或 运行 时,具体取决于天气,基 class 中的函数被声明为 'virtual'.
在非虚析构函数的情况下,要调用的析构函数由指针的类型决定。因此,即使指针变量 p
指向 Projectile
的实例,delete(p)
也会调用 Node
.
如果是虚拟析构函数,要调用的析构函数在运行时确定。因此,无论指针类型如何,被调用的析构函数都是在 p
.