상세 컨텐츠

본문 제목

C++ 가상 파괴자

C++/C++98

by deulee 2023. 8. 7. 17:40

본문

부모 클래스의 파괴자는 반드시 가상 파괴자로 선언되어야 한다.

 

다음 코드를 한번 보도록 하자.

#include <iostream>

class Parent
{
public:
	~Parent()
	{
		std::cout << "Parent Destructor" << std::endl;
	}
};

class Child : public Parent
{
public:
	~Child()
	{
		std::cout << "Child Destructor" << std::endl;
	}
};

int main(void)
{
	Parent* ptr = new Child;

	delete ptr;
	return 0;
}

출력 결과

충격적이게도 부모 파괴자만 호출되는 것을 볼 수 있을 것이다.

 

그 이유는 소멸자가 가상으로 되어 있지 않아 정적 결합을 통해 함수가 호출되었기 때문이다..

 

이 말은 포인터 변수 "ptr"의 정적 타입정적 결합으로 인하여 맞게 부모의 소멸자가 호출된 것이기 때문이다.

 

그렇기 때문에 소멸자를 가상 함수로 지정함으로써 동적 타입에 따라 동적 결합으로 소멸자가 호출될 수 있도록 해야 하는 것이다. 

 

또한 자식 클래스도 기반 클래스로 사용될 수 있는 가능성이 있다면 소멸자를 가상 함수로 선언하는 것이 좋다.

 

그래서 위의 코드를 고치면 다음과 같다.

 

#include <iostream>

class Parent
{
public:
	virtual ~Parent()
	{
		std::cout << "Parent Destructor" << std::endl;
	}
};

class Child : public Parent
{
public:
	virtual ~Child()
	{
		std::cout << "Child Destructor" << std::endl;
	}
};

int main(void)
{
	Parent* ptr = new Child;

	delete ptr;
	return 0;
}

 

 

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

C++ 함수 템플릿  (0) 2023.08.08
C++ 순수 가상 함수  (0) 2023.08.07
C++ 가상 함수  (0) 2023.08.07
C++ [Has a] 관계  (0) 2023.08.07
C++ 다중 상속  (0) 2023.08.07

관련글 더보기