부모 클래스의 파괴자는 반드시 가상 파괴자로 선언되어야 한다.
다음 코드를 한번 보도록 하자.
#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++ 함수 템플릿 (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 |