상속 virtual 소멸자

나무에물주기·2023년 1월 6일

CS

목록 보기
2/16

자식클래스는 자신이 부모클래스로부터 상속을 받는다는 사실을 알고 있기 때문에, 자신이 소멸될 때 부모 클래스의 소멸자도 호출하게 된다 (소멸자는 생성자의 역순)

하지만 부모클래스는 자신이 누구에게 상속을 해주는지 알 수 없기 때문에 먼저 소멸하게 되어버리면, 자식 클래스의 소멸자를 호출 할 수 없게 된다.

따라서 부모가 되는 기반 클래스들은 반드시 소멸자를 virtual로 만들어주어야 추후에 메모리 누수 문제가 발생하지 않는다.

하지만 그렇다고 무조건 virtual 키워드를 사용해서는 안되는데, virtual 키워드를 사용하게되면 가상 함수 테이블 포인터(vptr, virtual table pointer)가 생기고, 가상 함수 테이블(vtbl, virtual table)에 등록이 된다.

이러한 이유 때문에 메모리 적으로 공간을 차지하기 때문에 불필요 한 부분에 막 virtual을 붙여서는 안된다.

#include <iostream>
using namespace std;
class classA
{
public:
  classA();
  virtual ~classA();
};
class classB : public classA
{
public:
  classB();
  ~classB();
};
classA::classA()
{
  cout << "A" << endl;
}
classA::~classA()
{
  cout << "~A" << endl;
}
classB::classB()
{
  cout << "B"<< endl;
}
classB::~classB()
{
  cout << "~B" << endl;
}
int main()
{
  cout << "START" << endl;
  classB *B = new classB;
  classA *A = B;
  delete A;
  return 0;
}
결과 1 - classA 소멸자에 virtual을 쓰지 않았을 때
START
A
B
~A

결과 2 - classA 소멸자에 virtual을 사용했을 때
START
A
B
~B
~A
profile
개인 공부를 정리함니다

0개의 댓글