부모 클래스 소멸자 함수에 virtual키워드를 붙이는 이유

정채운·2023년 11월 1일
0

부모 클래스에 virtual 키워드를 안주었을때

class Player
{
public:
	Player()
	{
		cout << "Player()" << endl;
	}
	~Player()
	{
		cout << "~Player()" << endl;
	}
private:
	int _hp = 10;
};

class Knight : public Player
{
public:
	Knight()
	{
		cout << "Knight()" << endl;
	}
	~Knight()
	{
		cout << "~Knight()" << endl;
	}
};

void main() 
{
	Player* k1 = new Knight();


	delete k1;
	
}

출력 결과:
Player()
Knight()
~Player()

결과를 보면 Knight에 대한 소멸자 함수는 실행되지 않음

부모 클래스에 virtual 키워드 추가

class Player
{
public:
	Player()
	{
		cout << "Player()" << endl;
	}
	virtual ~Player()
	{
		cout << "~Player()" << endl;
	}
private:
	int _hp = 10;
};

class Knight : public Player
{
public:
	Knight()
	{
		cout << "Knight()" << endl;
	}
	~Knight()
	{
		cout << "~Knight()" << endl;
	}
};

void main() 
{
	Player* k1 = new Knight();


	delete k1;
	
}

출력 결과:
Player()
Knight()
~Knight()
~Player()

결과를 보면 Knight에 대한 소멸자 함수가 실행

이유

  • 가상함수가 아닌 일반함수라면 해당클래스의 포인터로 담고 있는 거에 따라서 함수가 호출되기 때문이다 ex) Player* k1 = new Knight(); -> Player타입의 포인터이기 때문에 Player의 소멸자만 실행되고 Knight의 소멸자는 메모리에 남게 됨

문제점

  • Knight의 소멸자가 실행되지않으므로 메모리 릭이 발생

0개의 댓글