프로그래밍 언어/C & C++ 정리

가상 소멸자와 비 가상 소멸자

뽀또치즈맛 2024. 11. 21. 15:31

비 가상 소멸자

가상 소멸자를 안쓰는 경우는 어떻게 될까?

가상 소멸자가 뭐길래, 가상 생성자는 없으면서

가상 소멸자가 메모리 누수를 방지한다고 할까?

왜 소멸자에 가상 키워드를 넣어야할까?

 

그에 대한 예시를 다음과 같이 추상화한 그림을 통해 알아보자.

 

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