왜 가상 파괴자가 필요한지 예를 통해서 보도록 하자.
아래는 우리가 일반적으로 사용하는 상속의 사용 예이다.
우리는 Derived 클래스가 Base를 상속받게 하고 Base 클래스를 포인터로 선언해
Derived를 생성해주고 있다.
우리는 생성과 파괴가 아래처럼 되기를 원할 것이다.
하지만 결과는 아래와 같이 나온다.
왜 그럴까..??
위 이유는 포인터의 형이 정해진 시점에서 이미 호출되어질 함수가 정해지기 때문이다.
포인터 p함수는 Base로 형이 선언되어 있기 때문에 자신의 함수 밖에 호출할 수 가 없다.
즉, 포인터가 무엇을 가리키든지 간에 Base로 형이 선언되어 있어서 호출 할 수 있는 함수도 정해져 있다는 것이다.
생성자의 경우는 소스에서 보듯이 new Derived를 했기 때문에 우리가 명시적으로 호출을 해주고 있지만.
파괴자의 경우는 Base의 파괴자만 호출이 되는 것이 맞다. 왜냐면 p함수는 Base 형이기 때문에.
그렇기 때문에 아래와 같은 소스로 바꿔야 한다.
위 소스와 같이 Base의 파괴자를 가상함수로 선언하게 되면 p의 파괴자가 동적바인딩이 되게 된다.
virtual 함수는 정적인 함수 호출을 동적 호출로 바꿀 수 있게 해주는 것이다.
위으 Base는 가상함수가 되며 동적 바인딩이 가능해진다. 동적바인딩이 되어 Base 형의 파괴자가
실행되는 것이 아니라 Derived의 파괴자가 실행되며 그 후 Base의 파괴자가 실행되어 완전한 메모리
해제가 이루어 진다.
'Programming > 이것저것' 카테고리의 다른 글
광역 변수 (0) | 2010.03.18 |
---|---|
Virtual Function (0) | 2010.03.18 |
try/catch와 if/else의 차이점 (0) | 2010.03.18 |
C++ Style Type Casting (0) | 2010.03.18 |
#pragma pack (0) | 2010.03.18 |