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

Minsu._.Lighting·2023년 11월 20일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 제목이 곧 핵심! "

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

💡 가상함수를 호출하면 안되는 이유

📌 기본 클래스의 생성자가 호출될 동안, 가상함수는 파생클래스로 절대 내려가지 않는다!

  • 기본 클래스 생성자는 파생 클래스 생성자 보다 앞서 실행되기 때문!
    - 기본 클래스 생성자가 실행될 때 파생 클래스의 데이터 멤버는 초기화가 이루어지지 않은 상태인데, 이 상태에서 파생클래스의 생성자에서는 데이터 멤버를 건드릴 확률이 높기 때문에 C++에서 막아 놓음.

📢 미초기화된 데이터 멤버는 정의되지 않은 상태에 있다!

📌 파생 클래스 객체의 기본 클래스 부분이 생성되는 동안 그 객체의 타입은 기본 클래스!

  • 호출되는 가상함수는 모두 기본 클래스의 것으로 결정 됌.

  • dynamic_cast, typeid와 같은 언어 요소를 사용해도 마찬가지!




💡 그럼 어떻게 해결 해야하나!

  • 가상 함수를 비가상 함수로 만든 후 필요한 정보들은 파생 클래스의 생성자에서 기본 클래스의 생성자로 넘기는 규칙을 만들자!
    - 비가상 함수로 생성자에서 안전하게 호출 가능!
profile
오코완~😤😤

0개의 댓글

관련 채용 정보