如何正确处置抽象类的抽象成员
How to properly dispose of abstract members of an abstract class?
我有一个这样的抽象类:
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...
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- C++从抽象类型定义类成员
- C++ 将一组对象传递给抽象类的成员函数
- 在 C++ 中访问抽象类成员中的类
- 复制构造抽象类型的数据成员
- 我应该初始化抽象类的成员吗?
- 从派生类调用的抽象基类成员函数
- 从抽象基类访问另一个基类成员
- 如何在c++中实现内部抽象成员类
- 返回虚拟函数的静态成员,对于抽象类缺少VT
- C++:具有成员的抽象类中的纯虚拟析构函数
- 抽象类成员变量
- 具有数据成员、构造函数和运算符重载的抽象基类
- C++中抽象成员和类函数指针的深层复制构造函数
- 类的抽象成员应该是指针还是引用
- 如何正确处置抽象类的抽象成员
- 存储抽象成员,保持接口简单
- 用部分模板特化重写抽象成员函数
- 将派生类成员函数的指针强制转换为抽象成员函数的指针