객체 생성과 소멸에 가상함수 호출하지 않기(effective c++ 09)

2015. 8. 2. 18:41프로그래밍/Effective C++

728x90
728x90

객체가 생성 시

기본 클래스 생성자는 파생 클래스 생성자 보다 앞서서 실행되기 때문에, 
기본 클래스 생성자가 동작할 시점에 파생 클래스 데이터 멤버는 아직 초기화된 상태가 아니다.

문제점
파생 클래스의 객체가 생성 될 때 부모 클래스의 생성자로 먼저 올라가고 
부모 클래스의 생성자에서 가상 함수를 호출할 경우 파생 클래스의 객체는 생성 시 
기본 클래스의 타입이므로 기본 클래스의 가상 함수를 호출 하게 된다.
호출되는 가상 함수는 모두 기본 클래스의 함수들로 결정될 뿐만 아니라 런타임 타입 정보를 사용하는 
언어 요소일 경우에도 마찬가지로 기본 클래스의 타입으로 판별된다.
기본 클래스의 생성자에서 어쩌다 호출된 가상 함수가 파생 클래스 쪽으로 내려가게 되면 
아직 생성이 완료되지 않은 파생 클래스의 데이터를 건드리게 되므로 심각한 에러를 초래할 수 있다.

객체 소멸 시

파생 클래스의 소멸자가 호출되고 나면 파생 클래스만의 데이터 멤버는 정의되지 않은 값으로가정하기 때문에, 

소멸 시점에서는 파생 클래스의 데이터가 없는 것으로 취급하고 동작한다.


문제점
기본 클래스 소멸자에 진입할 당시 객체는 기본 클래스 객체가 되며,
모든 C++ 기능들( 가상 함수, dynamic_cast, 기타 등등 ) 역시 기본 클래스 객체의 자격으로 처리된다.

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





728x90
반응형