如何正确处置抽象类的抽象成员

How to properly dispose of abstract members of an abstract class?

本文关键字:抽象 成员 抽象类 何正确      更新时间:2023-10-16

我有一个这样的抽象类:

class IMovable {
protected:
    MovementPath *movementPath;
public:
    IMovable();
    virtual ~IMovable();
    void setMovementPath(MovementPath *movementPath);
};

其中movementPath是一个独立的抽象类

IMovable的具体实现被删除时,我需要删除movementPath(更确切地说,它在那一点的具体实现)及其任何成员。

我该怎么做?

我尝试了虚拟析构函数,但那不起作用(我可能搞砸了什么),并且在具体的实现中删除它会导致程序崩溃,因为它是错误的,亵渎神明的,不应该在那里做。

我该怎么办?

IMovable,正如您所展示的,不是一个抽象类,因为它没有自己的抽象方法。作为抽象类型指针的数据成员不算数。

在任何情况下,为了回答你的问题,MovementPath需要一个虚析构函数,然后IMovable可以调用delete movementPath来调用正确的具体析构函数,而不管它实际是什么类型。

例如:

class MovementPath
{
...
public:
    virtual ~MovementPath() { ... }
...
};
class IMovable {
protected:
    MovementPath *movementPath;
public:
    IMovable() : movementPath(0) {}
    virtual ~IMovable() { delete movementPath; }
    void setMovementPath(MovementPath *newPath) {
        // whether or not you need to 'delete movementPath' here
        // depends on your particular requirements...
        movementPath = newPath;
    }
};

class MyMovementPath : public MovementPath
{
...
public:
    ~MyMovementPath() { ... }
...
};
class MyMovable : public IMovable
{
...
public:
    MyMovable() : IMovable() { ... }
    ~MyMovable() { ... }
...
};

MyMovementPath *path = new MyMovementPath;
MyMovable *movable = new MyMovable;
movable->setMovementPath(path);
...
delete movable; // <-- will delete the path as well...