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를 붙일 수 없다. 
 - 부모 소멸자가 가상 소멸자가 아니라면 자식 소멸자에 
 
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
      
    
댓글 남기기