2016-11-03 4 views
0

나는이 같은 추상 클래스가 : movementPath은 그 자체에 추상 클래스입니다추상 클래스의 추상 멤버를 올바르게 처리하는 방법은 무엇입니까?

class IMovable { 
protected: 
    MovementPath *movementPath; 

public: 
    IMovable(); 
    virtual ~IMovable(); 
    void setMovementPath(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

관련 문제