如何正确处理抽象class的抽象成员?

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

我有一个像这样的摘要class:

class IMovable {
protected:
    MovementPath *movementPath;

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

其中 movementPath 是一个抽象 class 本身。

删除 IMovable 的具体实现后,我需要删除 movementPath(更准确地说是此时的具体实现)及其任何成员。

我该怎么做?

我尝试了虚拟析构函数,但是没有用(我可能搞砸了一些东西)并且在具体实现中删除它会使程序崩溃,因为它是错误的,亵渎神明的,不应该在那里完成。

我该怎么办?

正如您所展示的,

IMovable 不是抽象的 class,因为它没有自己的抽象方法。作为抽象类型指针的数据成员不算在内。

无论如何,要回答你的问题,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...