일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- implicit conversion
- operator new
- 오블완
- reference
- 언리얼
- UE4
- Effective c++
- 반복자
- 영화 리뷰
- lua
- 티스토리챌린지
- 암시적 변환
- effective stl
- more effective c++
- Smart Pointer
- 상속
- exception
- 다형성
- 스마트 포인터
- 루아
- 참조자
- 비교 함수 객체
- resource management class
- 영화
- c++
- 예외
- 메타테이블
- virtual function
- Vector
- 게임
Archives
- Today
- Total
스토리텔링 개발자
[Effective C++] 7. 다형성 부모 클래스라면 가상 소멸자 선언 본문
728x90
항목 7. 다형성을 가진 기본클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.
기본 클래스의 소멸자가 비가상 소멸자라면
- 기본 클래스 포인터에 할당된 파생 클래스 객체가 삭제될 때의 프로그램 동작이 미정의 사항(C++ 규정으로 정해져 있지 않다) 이다.
- 그러므로 가상 함수를 하나라도 가진 클래스는 가상 소멸자를 가지는 것이 대부분 올바른 선택이다.
기본 클래스로 의도하지 않은 클래스에 가상 소멸자를 선언하는 건 좋지 않다.
- 객체의 크기가 커진다.
- 가상 함수를 하나라도 가지는 클래스는 가상 테이블(vtbl)의 시작 주소(vptr)를 가지게 되기 때문이다.
- 다른 언어로 선언된 동일한 자료구조와의 호환성이 없어진다.
- 다른 언어에서는 vptr을 만들 수 없기 때문이다.
추상 클래스로 만들고 싶지만 마땅히 만들만한 순수 가상함수가 없다면
- 순수 가상 소멸자를 선언한다.
- 추상 클래스는 당연히 기본 클래스로 쓰일텐데, 기본 클래스라면 마땅히 가상 소멸자를 가져야 한다.
가상 소멸자의 호출 매커니즘
- 기본 클래스 소멸자는 가상 테이블(vtbl)을 거치지 않고 직접 호출하므로 본체가 반드시 있어야 한다.
- 즉, 소멸자는 반드시 정의를 해야 한다. 그게 순수 가상 소멸자라도!
- 소멸자 동작 순서
- 가장 말단의 파생 클래스 -> 기본 클래스 순으로 소멸자가 동작한다.
- 생성자는 당연하지만 그 반대 순.
- 이는 다형성을 가진 기본 클래스에만 적용되는 사실이다.
- 모든 기본 클래스가 다형성을 갖도록 설계되진 않는다.
728x90
'개발 > Effective C++' 카테고리의 다른 글
[Effective C++] 9. 객체 생성 / 소멸 중 가상 함수 호출 문제 (0) | 2024.05.23 |
---|---|
[Effective C++] 8. 소멸자 호출 중 예외 문제 (0) | 2024.05.22 |
[Effective C++] 6. 암시적으로 생성되는 함수 금지하기 (0) | 2024.05.20 |
[Effective C++] 5. 암시적으로 생성되는 함수 (0) | 2024.05.17 |
[Effective C++] 4. 객체 초기화 문제 (0) | 2024.05.16 |
Comments