비 가상 소멸자
가상 소멸자를 안쓰는 경우는 어떻게 될까?
가상 소멸자가 뭐길래, 가상 생성자는 없으면서
가상 소멸자가 메모리 누수를 방지한다고 할까?
왜 소멸자에 가상 키워드를 넣어야할까?
그에 대한 예시를 다음과 같이 추상화한 그림을 통해 알아보자.
myCat이 delete될 경우(virtual 소멸자가 아닌 경우)
왜 그럴까?
전에 정리한 가상 테이블을 기억해내면 금방 왜 그런지 알 수 있다.
만약 virtual 키워드를 붙였을 경우
즉 자신의 실 자료형에 맞는 소멸자를 호출하기 위함이다.
가상 소멸자는 매우 중요하다.
반드시 유의할 점은,
모든 클래스마다 가상 소멸자를 꼭 써줘야 한다.
근데 가상함수 느리다면서
가상 소멸자가 있는 클래스를 상속받지 않아도 이러라고? 싶을 수 있다.
근데 업캐스팅 해서 쓸 때,
부모 소멸자만 호출되면 대참사이다.
모든 업계와 모든 회사가 권고하지 않지만,
가상 함수가 느리더라도
소멸자에 무조건 virtual 키워드를 붙이도록 권고되고 있다.
멤버함수의 가상성은 상속된다.
- 베이스 클래스에서 가상으로 선언된 멤버함수가 있다면
- 파생 클래스에서 동일한 시그내처를 가진 함수 역시 가상함수이다.
- virtual 키워드가 안 붙어 있어도 마찬가지이다.
만약 Animal 클래스에서 소멸자가 virtual 키워드를 붙여졌다면
해당 클래스를 상속받은 Cat,
Cat을 상속받은 Jerry의 소멸자도 가상성이 상속된다.
즉 Jerry 클래스를 delete 했을 때 소멸자 순서는
~Jerry()
~Cat()
~Animal()
순서이다.
'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글
Casting - 왜 C스타일 캐스팅은 4개로 나뉘었을까? (0) | 2024.11.24 |
---|---|
인터페이스 (0) | 2024.11.22 |
다형성(Polymorphism) (2) | 2024.11.20 |
템플릿의 장단점 (0) | 2024.11.19 |
범용 데이터 구조 (0) | 2024.11.12 |