가상 소멸자
- 기본 클래스(부모 클래스)로 사용될 클래스의 소멸자는 모두 가상 소멸자로 만들자
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);
}
- 생성자는 부모 생성자가 수행되고 자식 생성자가 수행된다.
- 소멸자는 자식 소멸자가 수행되고 부모 소멸자가 수행된다.
- 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;
}
- 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;
}
결론
- "기본 클래스의 소멸자는 가상 소멸자로 선언하라!"