728x90
C++에서 소멸자에 virtual을 사용하는 이유는? (tistory.com)
ClassA = 부모 클래스 / ClassB = ClassA를 상속하는 자식클래스라고 할때
ClassB *B = new ClassB (A 생성자 -> B 생성자)
delete B (B 소멸자 -> A 소멸자)
생성자와 소멸자는 이 순서로 호출됨
if 다형성 이용을 위해 ClassA 포인터에 자식클래스 ClassB를 할당하면?
classA *A = new ClassB (A생성자 => B생성자)
delete A (클래스 A를 virtual로 선언했을 때 / B소멸자 => A소멸자)
delete A (클래스 A를 virtual로 선언하지 않았을 때 / A소멸자)
부모 클래스의 소멸자를 virtual로 선언하지 않으면 자식 클래스의 소멸자가 작동하지 않음
이유: 부모클래스의 포인터로 자식클래스를 호출할 때
가상 함수로 정의되지 않은 자식클래스의 함수를 호출하면 부모클래스의 멤버 함수가 호출됨.
소멸자도 자식 클래스의 소멸자가 아닌 부모클래스의 소멸자가 호출됨
이와 같은 이유로 자식 클래스의 메모리 해제가 필요하다면 반드시 부모 클래스에 소멸자를 작성해야한다.
728x90
'CS > C++' 카테고리의 다른 글
스마트포인터 / 사이클 해결 방법 (1) | 2023.12.08 |
---|---|
버퍼 오버플로우 (0) | 2023.12.08 |
함수 호출 stack frame 관련 (1) | 2023.12.08 |
전방선언이 필요한 이유? (1) | 2023.12.08 |
[C++]Vector와 List의 차이점 (0) | 2023.10.01 |