프로그램/C,C++

[C++ 기본 4] 1. 가상소멸자

naudhizb 2022. 5. 17. 19:43
반응형

대부분의 C++ 프로그램에서는 객체를 핸들링하기 위해서 객체 포인터를 주로 사용하며, 파생클래스와 기반클래스 객체들을 일괄로 다루기 위해 기반클래스 포인터를 사용한다.

만약, 기반클래스 포인터를 이용하여 객체를 핸들링할 때, 객체의 소멸자가 가상함수가 아니라면 파생클래스를 소멸시킬 때 기반클래스의 포인터를 이용하여 소멸시키기 때문에 기반클래스의 소멸자가 불려 비정상적으로 객체를 소멸시키게 된다.

때문에 클래스의 소멸자는 가상함수(virtual function)이어야만 한다.

// 1_가상소멸자     149 page
#include <iostream>

// 핵심 : 모든 기반 클래스의 소멸자는 반드시 가상함수 이어야 한다.

class Base
{
public:
    virtual ~Base() {} // 기반 클래스의 소멸자가 가상이면
                       // 모든 파생클래스의 소멸자는 가상함수이다
};
class Derived : public Base
{
public:
    Derived()  { std::cout << "자원할당" << std::endl; }
    virtual ~Derived() { std::cout << "자원해지" << std::endl; }
};
int main()
{
    Base* p = new Derived; // 기반 클래스포인터 = &파생클래스
    delete p; 
}
반응형