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...
내가 질문을하지 않습니다. MovementPath는 기본 추상 클래스입니까? – mkmostafa
당신은 아마도 세 가지 규칙을 여러 차례 위반했을 것입니다. 소유권 의미론이있는 원시 포인터 사용을 중지합니다. 더 이상 1996이 아닙니다. –
할거야. 아니 원시 타입을 인식하지 못했습니다. – Karlovsky120