본문 바로가기
C++/기초

C++ 기초 : 상속 (2)

글: 시플마 2024. 5. 4.

자식 클래스로 객체를 생성하여

자식 클래스의 생성자가 호출됩니다.

이때 먼저 부모 클래스의 생성자로 가서

부모 클래스의 멤버를 초기화하여

부모 클래스의 생성자의 동작을 완료한 후에

다시 자식 클래스로 돌아와 자식 클래스의

멤버를 초기화하면서 자식 클래스 생성자의

동작을 완료하죠.

 

 

그럼 소멸자는 어떤 순서로 동작할까요?

 

소멸자의 경우 자식 클래스의 소멸자가 호출되고

자식 클래스 소멸자의 동작이 모두 완료된 후에

부모 클래스의 소멸자가 호출되어 부모 클래스 소멸자의

동작을 완료합니다.

 

 

정말 그렇게 동작하는지 살펴 보죠.

 

main 함수에서 자식 클래스로 

객체를 만들었습니다.

 

그러면 main 함수 종료 직전에 자식 클래스에 있는 소멸자와

상속받은 부모 클래스에 있는 소멸자가 호출되어야겠죠.

 

이를 확인하기 위해 main 함수 종료 직전, 41번째 줄에 있는 

return 0; 구문에 중단점을 걸고 F11을 눌러 하나씩

디버깅을 해 보겠습니다.

 

 

 F11을 누르자 자식 클래스의 소멸자가 먼저

호출이 됩니다. 조금 더 진행해 보겠습니다.

 

생성자의 경우는 자식 클래스 생성자 안에 있는 코드를 실행하기

전에 부모 클래스의 생성자로 이동했지만, 소멸자의 경우

자식 클래스의 소멸자 안에 있는 코드를 먼저 실행하는 것을 

확인할 수가 있습니다. 콘솔 창에서 그 모습을 확인할 수 있죠.

 

또한 호출 스택을 보시면

 

자식 클래스의 소멸자가 동작을 완료하는 동안

여전히 호출 스택에는 자식 클래스의 소멸자만 있습니다.

즉 이 시점에는 부모 클래스의 소멸자가 호출되지도 않았다는 

것이죠.

 

 

이 상태에서 디버깅을 더 진행하면

 

부모 클래스의 소멸자로 이동하게 됩니다. 

 

호출 스택을 보시면

 

맨 위에 부모 클래스의 소멸자가 쌓여 있습니다.

이 시점에는 자식 클래스 소멸자의 동작을 완료하고

자식 클래스의 소멸자를 호출 스택에서 지우기 직전에

부모 클래스의 소멸자를 호출하게 되는 것이죠.

 

 

디버깅을 더 진행해 보겠습니다.

 

그러자 부모 클래스의 소멸자 안에 있는 코드를

실행하고 다시 자식 클래스로 돌아오는 모습입니다. 

 

호출 스택을 보시면

 

부모 클래스 소멸자의 동작이 완료되어 스택에서 사라졌습니다.

이후 다시 자식 클래스로 돌아온 것을 호출 스택을 통해서도

알 수 있죠.

 

 

이후에는

 

다시 main 함수 종료 지점으로 돌아옵니다.

 

호출 스택에서도

 

자식 클래스 소멸자가 스택에서 사라지고

main 함수만 남아 있는 것을 확인할 수 있습니다.

 

 

이후 프로그램이 종료되겠죠.

 

 


 

 

F5를 눌러 디버깅을 진행하고 

Ctrl + Alt + D를 누르면 디스어셈블리 창이 나옵니다.

 

디스어셈블리 창에서 소멸자의 동작을 확인해 보면

 

main 함수에서 return 0; 구문 이후

자식 클래스의 소멸자가 호출되는 것이 보이시나요?

 

 

F10을 눌러 쭉 실행하고 자식 클래스의 소멸자가

호출되는 시점에서 F11을 눌러 진입하겠습니다.

 

자식 클래스의 소멸자가 실행되네요.

cout 동작이 완료된 이후 시점에

부모 클래스의 소멸자가 호출되는 것이 

보이시나요?

 

 

F10을 통해 

 

한 줄씩 실행하다가

부모 클래스의 소멸자가 호출되는 시점에서

F11을 눌러 보면 부모 클래스의 소멸자가

실행되는 것을 확인할 수 있습니다.

 

 

이 상태에서 F10을 눌러 쭉 실행하면

 

다시 자식 클래스의 소멸자로 돌아오게 됩니다.

 

 

이후 남은 코드를 마저 실행하고

 

프로그램이 종료가 되겠죠.

 

 

 

 


강의 출처 : https://www.youtube.com/watch?v=6djItppsrb4&list=PL4SIC1d_ab-aOxWPucn31NHkQvNPHK1D1&index=83


'C++ > 기초' 카테고리의 다른 글

C++ 기초 : 다형성 (2)  (0) 2024.05.04
C++ 기초 : 다형성 (1)  (0) 2024.05.04
C++ 기초 : 오버라이딩  (0) 2024.05.03
C++ 기초 : 상속 (1)  (0) 2024.05.03
C++ 기초 : tree (10)  (0) 2024.05.03