C++ Chapter 12.4 : 가상 소멸자
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 12. 가상 함수들 : 가상 소멸자
🔔 가상 소멸자를 사용하기 전
#include <iostream>
using namespace std;
class Base
{
public:
~Base()
{
cout << "~Base()" << endl;
}
};
class Derived : public Base
{
private:
int *m_array;
public:
Derived(int length)
{
m_array = new int[length];
}
~Derived()
{
cout << "~Derived()" << endl;
delete[] m_array;
}
};
int main()
{
Derived derived(5);
return 0;
}
💎출력💎
~Derived()
~Base()
- 생성자 호출 순서와 다르게 소멸자는
- 자식 소멸자가 먼저 호출되고 그 다음에 부모 소멸자가 호출된다.
- 제일 조상일 수록 가장 마지막에 소멸 됨.
int main()
{
Derived * derived = new Derived(5); // 동적 할당
Base * base = derived; // 다형성, 동적할당
delete base;
return 0;
}
💎출력💎
~Base()
delete base
- 부모인 Base 타입인
base
는 자식인 Derived 타입의derived
객체를 참조하고 있다. - 이때
base
를 delete시켜주면 Derived 소멸자는 호출 되지 않고 부모인 Base 소멸자만 호출된다.
- 부모인 Base 타입인
자식을 지우면 (자식 소멸자 👉 부모 소멸자) 순으로 부모 소멸자까지 호출되지만, 부모를 지우면 부모 소멸자만 호출되며 자식 소멸자는 호출되지 않는다.(상속에 있어 부모는 자식을 다 포함하지 않으므로 당연한 얘기!)
- 소멸자도 자식들 본연의 소멸자들이 각각 다르게 호출되야 한다.
- 일일이 delete 자식1, delete 자식2, … 해줄 수도 없고 😱
- 자식 객체 내용물 중 동적 할당 받은 부분이 있어 이는 delete 되지 않으면 메모리 누수 문제가 생길 수 있다.
🔔 가상 소멸자 virtual
소멸자에
virtual
을 붙여주면 부모 타입으로 자식 객체를 참조해도 자식 객체의 소멸자를 호출 시킨다. 가상 함수와 비슷.
#include <iostream>
using namespace std;
class Base
{
public:
virtual ~Base()
{
cout << "~Base()" << endl;
}
};
class Derived : public Base
{
private:
int *m_array;
public:
Derived(int length)
{
m_array = new int[length];
}
~Derived()
{
cout << "~Derived()" << endl;
delete[] m_array;
}
};
int main()
{
Derived * derived = new Derived(5); // 동적 할당
Base * base = derived; // 다형성, 동적할당
delete base;
return 0;
}
💎출력💎
~Derived()
~Base()
- virtual ~Base() : 가상 소멸자
- 마찬가지로 Derived의 소멸자 ~Derived()도
virtual
속성을 물려받게 된다.
- 마찬가지로 Derived의 소멸자 ~Derived()도
delete base
- 이제 원래대로 먼저 자식 소멸자가 호출되며 뒤이어 부모 소멸자가 호출된다.
~Derived() override
{ㄴ
cout << "~Derived()" << endl;
delete[] m_array;
}
- 자식 소멸자에
override
를 붙일 수 있는데 이 경우엔 꼭 부모 소멸자에virtual
을 붙여주어야 한다.- 부모 소멸자가 가상 소멸자가 아니라면 자식 소멸자에
override
를 붙일 수 없다.
- 부모 소멸자가 가상 소멸자가 아니라면 자식 소멸자에
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기