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