2016-11-03 99 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