Programming Language/C, C++

C++ 가상 함수 (virtual) - 가상 소멸자

MOLOKINI 2014. 11. 7. 16:42

가상 소멸자

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

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

 

 

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

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

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

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

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

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

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

 

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

 

Rectangle 파생 클래스 소멸자 추가

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

 

Eclipse 파생 클래스 소멸자 추가

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