가상 소멸자

클래스에 가상 함수를 정의할 때 주의할 점은 소멸자도 가상함수로 만들어야 한다는 점입니다.

동적으로 생성한 파생 클래스 객체를 기본 클래스 포인터로 가리키고 있을 때 동적으로 생성한 객체를 해제하려면 기본 클래스 포인터로부터 delete 해야 합니다.



delete pShape;는 pShape가 Shape 포인터이므로 Shape 클래스의 소멸자를 호출합니다.

- delete pShape;는 항상 기본 클래스인 Shape 클래스의 소멸자만 호출됩니다.

- pShape가 실제로는 Rectangle 클래스 객체의 주소를 저장하므로 pShape로 delete할 때 Rectangle의 소멸자가 호출되어야 합니다.

- 이를 위해 Shape 클래스의 소멸자를 가상함수로 선언하면 됩니다.

동적으로 생성한 파생 클래스의 객체를 기본 클래스 포인터로 가리킬 때 기본 클래스 포인터로 delete 하더라도 파생 클래스의 소멸자가 호출되도록 하려면 기본 클래스의 소멸자를 가상 소멸자로 정의해야 합니다.

- 기본 클래스의 소멸자를 가상 함수로 선언하면 파생 클래스의 소멸자도 모두 가상 함수가 됩니다.

- 이 때, 파생 클래스 소멸자에는 virtual 키워드를 생략할 수 있습니다.


Shape 기본 클래스 가상 소멸자 추가 (~Shape();)


Rectangle 파생 클래스 소멸자 추가

- 파생 클래스의 소멸자에는 가상 소멸자를 사용하지 않아도 됩니다.


Eclipse 파생 클래스 소멸자 추가

- 파생 클래스의 소멸자에는 가상 소멸자를 사용하지 않아도 됩니다.



Main 클래스

- 소멸자는 사용이 완료되는 즉시 사용합니다.

파생 클래스의 소멸자 작동 후 기본 클래스의 소멸자가 작동하게 됩니다.


만약, 기본 클래스의 소멸자가 가상함수가 아니라면

- ~Shape() 소멸자에 virtual 키워드가 빠져있습니다. 실행시키면!!

이렇게 기본 클래스의 소멸자만 동작하게 됩니다.


결론적으로 클래스에 가상함수가 있고 클래스가 반드시 소멸자를 사용해야하는 상황이라면 소멸자도 가상함수로 선언해야합니다.

Posted by 긍정왕오킹