[c++] 구조체와 클래스의 가상 소멸자

C++에서 구조체와 클래스는 거의 동일하지만 가장 큰 차이점 중 하나는 기본적으로 클래스는 private 접근 지정자를 가지고 있지만 구조체는 public 접근 지정자를 가진다는 것입니다. 그러나 C++11 이후부터는 이러한 차이가 크게 없어졌습니다.

가상 소멸자는 C++에서 상속 및 다형성을 지원하기 위해 사용됩니다.

가상 소멸자는 다형성으로 인해 C++에서 매우 중요하며, 기본 클래스의 포인터를 사용하여 파생된 클래스의 객체를 삭제할 때 사용됩니다.

가상 소멸자가 구조체와 클래스에서 어떻게 다르게 작동하는지 알아보겠습니다.

구조체에서의 가상 소멸자

struct Base {
    virtual ~Base() {
        std::cout << "Base 구조체의 소멸자" << std::endl;
    }
};

struct Derived : Base {
    ~Derived() {
        std::cout << "Derived 구조체의 소멸자" << std::endl;
    }
};

클래스에서의 가상 소멸자

class Base {
public:
    virtual ~Base() {
        std::cout << "Base 클래스의 소멸자" << std::endl;
    }
};

class Derived : public Base {
public:
    ~Derived() {
        std::cout << "Derived 클래스의 소멸자" << std::endl;
    }
};

가상 소멸자의 중요성

가상 소멸자는 파생 클래스의 소멸자가 제대로 호출되도록 보장합니다.

Base* obj = new Derived();
delete obj; // 파생 클래스의 소멸자까지 올바르게 호출됨

결론

가상 소멸자는 C++에서 상속 및 다형성에 필수적입니다. 구조체와 클래스 모두에서 사용할 수 있으며, 파생 클래스의 소멸자가 호출되도록 보장합니다. 가상 소멸자는 메모리 누수와 객체 소멸 과정에서 발생할 수 있는 문제를 방지하기 위해 중요한 역할을 합니다.