C++:调用了错误的析构函数

C++: Wrong Destructor Called

ProjectileNode 的子类。 我想要调用 Projectile 析构函数。

注意:在现实生活中,我有一个 Node* 的列表,它们是 ProjectilePlayerEnemy,每个都有自己的析构函数。

Node.h file 中没有指定的析构函数(我假设它使用默认的析构函数。)

    Node* p = new Projectile();
    delete(p); //Projectile destructor is never called

你得把Node的析构函数改成virtual,这里默认的(非虚)不能满足需求,即动态多态不行。

class Node {
public:
    virtual ~Node() {}
}

首先,从你的问题中可以很清楚地看出 ProjectileNodesubclass(参见 this Wikipedia entry).

如果你有一个像 Node 这样的 class 是为 subclassing 构建的,那么你应该确保它的析构函数是虚拟的:

class Node
{
...
    virtual ~Node();
};

这将导致编译器调用适当的 classs destructor when youdelete` 指向 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.

指向的对象中定义的析构函数