검색결과 리스트
글
이유
1. 호출한 결과가 원하는 대로 돌아가지 않을 것이다.
2. 제대로 돌아간다 해도 폭탄을 가지고 있는 것과 같다.
설명
파생 클래스 객체가 생성될 때 그 객체의 기본 클래스 부분이 파생 클래스 부분보다 먼저 호출된다. 그렇기에 기본 클래스의 생성자가 호출될 동안에는, 가상 함수는 절대로 파생 클래스 쪽으로 내려가지 않는다.
기본 클래스 생성자는 파생 클래스 생성자보다 먼저 실행되기 때문에, 기본 클래스 생성자가 돌아가고 있을 때 파생 클래스 데이터 멤버는 아직 초기화 된 상태가 아닌 것이 핵심이다.
객체가 소멸 될 때는 파생 클래스의 소멸자가 일단 호출되고 파생 클래스만의 데이터 멤버는 정의되지 않은 값으로 가정하기 때문에, C++은 이들을 없는 것처럼 취급하고 진행한다. 기본 클래스 소멸자에 진입할 떄 객체는 기본 클래스 객체가 되며, 모든 C++ 기능들 (가상 함수, dynamic_cast, 기타 등등) 역시 기본 클래스 객체의 자격으로 처리한다.
참조
상속관계의 클래스 호출 순서는 다음과 같다.
1. 클래스 생성 시
이것만은 잊지 말자!
- 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 말자. 가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로는 내려가지 않는다.
관련링크
http://ikpil.tistory.com/410
http://evax.springnote.com/pages/871402
http://ljh131.tistory.com/16
2. 제대로 돌아간다 해도 폭탄을 가지고 있는 것과 같다.
설명
파생 클래스 객체가 생성될 때 그 객체의 기본 클래스 부분이 파생 클래스 부분보다 먼저 호출된다. 그렇기에 기본 클래스의 생성자가 호출될 동안에는, 가상 함수는 절대로 파생 클래스 쪽으로 내려가지 않는다.
기본 클래스 생성자는 파생 클래스 생성자보다 먼저 실행되기 때문에, 기본 클래스 생성자가 돌아가고 있을 때 파생 클래스 데이터 멤버는 아직 초기화 된 상태가 아닌 것이 핵심이다.
객체가 소멸 될 때는 파생 클래스의 소멸자가 일단 호출되고 파생 클래스만의 데이터 멤버는 정의되지 않은 값으로 가정하기 때문에, C++은 이들을 없는 것처럼 취급하고 진행한다. 기본 클래스 소멸자에 진입할 떄 객체는 기본 클래스 객체가 되며, 모든 C++ 기능들 (가상 함수, dynamic_cast, 기타 등등) 역시 기본 클래스 객체의 자격으로 처리한다.
참조
상속관계의 클래스 호출 순서는 다음과 같다.
1. 클래스 생성 시
- 기본 클래스 생성자 호출 후 기본 클래스 멤버 객체 초기화
- 파생 클래스 생성자 호출 후 파생 클래스 멤버 객체 초기화
- 파생 클래스 소멸자 호출 후 파생 클래스 멤버 객체 소멸
- 기본 클래스 소멸자 호출 후 기본 클래스 멤버 객체 소멸
이것만은 잊지 말자!
- 생성자 혹은 소멸자 안에서 가상 함수를 호출하지 말자. 가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로는 내려가지 않는다.
관련링크
http://ikpil.tistory.com/410
http://evax.springnote.com/pages/871402
http://ljh131.tistory.com/16
'Programming > Effective C++ 3판' 카테고리의 다른 글
항목 12. 객체의 모든 부분을 빠짐없이 복사하자. (0) | 2009.02.17 |
---|---|
항목 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 (0) | 2009.02.17 |
항목 10. 대입 연산자는 *this 참조자를 반환하게 하자 (0) | 2009.02.15 |
항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자. (0) | 2009.02.15 |
항목 8. 예외가 소멸자를 떠나지 못하도록 붙들여 놓자. (0) | 2008.07.10 |
항목 7. 다형성을가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2008.07.01 |
항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자. (0) | 2008.06.27 |
항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2008.06.27 |
항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자. (0) | 2008.06.10 |
항목 3. 낌새만 보이면 const를 들이대 보자! (0) | 2008.06.10 |
항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자. (0) | 2008.05.29 |