如何正确处理抽象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...
我有一个像这样的摘要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...