본문 바로가기
Programming/Effective C++ 3판

항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자.

by deviAk 2009. 2. 15.
반응형

이유
1. 호출한 결과가 원하는 대로 돌아가지 않을 것이다.
2. 제대로 돌아간다 해도 폭탄을 가지고 있는 것과 같다.

설명
파생 클래스 객체가 생성될 때 그 객체의 기본 클래스 부분이 파생 클래스 부분보다 먼저 호출된다.  그렇기에 기본 클래스의 생성자가 호출될 동안에는, 가상 함수는 절대로 파생 클래스 쪽으로 내려가지 않는다.

기본 클래스 생성자는 파생 클래스 생성자보다 먼저 실행되기 때문에, 기본 클래스 생성자가 돌아가고 있을 때 파생 클래스 데이터 멤버는 아직 초기화 된 상태가 아닌 것이 핵심이다.

객체가 소멸 될 때는 파생 클래스의 소멸자가 일단 호출되고 파생 클래스만의 데이터 멤버는 정의되지 않은 값으로 가정하기 때문에, C++은 이들을 없는 것처럼 취급하고 진행한다. 기본 클래스 소멸자에 진입할 떄 객체는 기본 클래스 객체가 되며, 모든 C++ 기능들 (가상 함수, dynamic_cast, 기타 등등) 역시 기본 클래스 객체의 자격으로 처리한다.

참조
상속관계의 클래스 호출 순서는 다음과 같다.

1. 클래스 생성 시
  1. 기본 클래스 생성자 호출 후 기본 클래스 멤버 객체 초기화
  2. 파생 클래스 생성자 호출 후 파생 클래스 멤버 객체 초기화
2. 클래스 소멸 시
  1. 파생 클래스 소멸자 호출 후 파생 클래스 멤버 객체 소멸
  2. 기본 클래스 소멸자 호출 후 기본 클래스 멤버 객체 소멸

이것만은 잊지 말자!
- 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 말자. 가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로는 내려가지 않는다.

관련링크
http://ikpil.tistory.com/410
http://evax.springnote.com/pages/871402
http://ljh131.tistory.com/16

반응형