2016-11-03 124 views
0

我有一个抽象类是这样的:如何正确处理抽象类的抽象成员?

class IMovable { 
protected: 
    MovementPath *movementPath; 

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

movementPath是在它自己的一个抽象类。

IMovable的具体实现被删除时,我需要删除movementPath(更确切的说就是它的具体实现)以及它的任何成员。

我该怎么做?

我试过虚拟析构函数,但没有奏效(我可能已经搞砸了),并在具体实现中删除它会崩溃程序,它应该是因为它是错误的,亵渎的,不应该在那里完成。

我该怎么办?

+0

我不明白的问题。 MovementPath是一个基本的抽象类吗? – mkmostafa

+4

你可能已经违反了三次规则。停止使用拥有所有权语义的原始指针。现在不是1996年了。 –

+0

会做。没有意识到非原始类型。 – Karlovsky120

回答

2

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... 
+0

对,它是一个基类,但不是抽象的。 – Karlovsky120