C++ 가상 소멸자

mohadang·2022년 12월 4일
0

C++

목록 보기
35/48
post-thumbnail
post-custom-banner

가상 소멸자

  • 기본 클래스(부모 클래스)로 사용될 클래스의 소멸자는 모두 가상 소멸자로 만들자

class Person
{
  char name[20];
  int age;
public:
  Person(const char* n, int a)   
  {
    cout << "Person 생성자" << endl;
    strcpy(name, n);
    age = a;
  }
  ~Person( )
  {
    cout << "Person 소멸자" << endl;
  }
};
class Student : public Person
{
  int grade;
public:
  Student(const char* n, int a, int g):Person(n,a), grade(g)
  {
    cout << "Student 생성자" << endl;
  }
  ~Student( )
  {
    cout << "Student 소멸자" << endl;
  }
};
void main( )
{
  Student student1("김학생", 20, 1);
}
// Person 생성자
// Student 생성자
// Student 소멸자
// Person 소멸자
  • 생성자는 부모 생성자가 수행되고 자식 생성자가 수행된다.
  • 소멸자는 자식 소멸자가 수행되고 부모 소멸자가 수행된다.
  • student1의 정적 타입이 Student이고 자식 소멸자와 부모 소멸자 둘다 호출한다.

Student 객체를 동적으로 생성하고 삭제하는 예제 - 문제 발생

class Person
{
  char name[20];
  int age;
public:
  Person(const char* n, int a)   
  {
    cout << "Person 생성자" << endl;
    strcpy(name, n);
    age = a;
  }
  ~Person( )
  {
    cout << "Person 소멸자" << endl;
  }
};

...

void main( )
{
  Person *pPerson;
  pPerson = new Student("김학생", 20, 1);
  delete pPerson;
}
// Person 생성자
// Student 생성자
// Person 소멸자
  • Student의 소멸자가 호출되지 않는다. pPerson의 정적 타입이 Person 포인터라 바로 Person소멸자가 호출되고 Student의 소멸자를 호출하지 못한다.
  • 가상함수처럼 소멸자도 가상 소멸자로 만들어야 정확한 소멸자가 호출된다.

가상 소멸자 사용하여 문제 해결

class Person
{
  char name[20];
  int age;
public:
  Person(const char* n, int a)   
  {
    cout << "Person 생성자" << endl;
    strcpy(name, n);
    age = a;
  }
  virtual ~Person( )
  {
    cout << "Person 소멸자" << endl;
  }
};

...

void main( )
{
  Person *pPerson;

  pPerson = new Student("김학생", 20, 1);
  delete pPerson;
}
// Person 생성자
// Student 생성자
// Student 소멸자
// Person 소멸자
  • 정확하게 소멸자가 호출한다.

결론

  • "기본 클래스의 소멸자는 가상 소멸자로 선언하라!"
profile
mohadang
post-custom-banner

0개의 댓글