파생 클래스의 생성자와 소멸자의 동작
생성자와 소멸자는 다소 특별한 멤버함수입니다. 클래스의 생명주기에 관여하며,
해당 클래스가 생성될때와 소멸될때 무슨 행동을 해야 할지를 지정하는 역할입니다.
이에 다른 멤버 함수들과는 상속시에 조금 다른 규칙을 가지고 있습니다.
#include <iostream>
class Person
{
public:
Person()
{
std::cout << "Person's Constructor" << std::endl;
}
~Person()
{
std::cout << "Person's Destructor" << std::endl;
}
};
class Student : public Person
{
public:
Student()
{
std::cout << "Student's Constructor" << std::endl;
}
~Student()
{
std::cout << "Student's Destructor" << std::endl;
}
};
class Employee : public Person
{
public:
Employee()
{
std::cout << "Employee's Constructor" << std::endl;
}
~Employee()
{
std::cout << "Employee's Destructor" << std::endl;
}
};
int main(int argc, char** argv)
{
Person* person = new Person;
Student* student = new Student;
Employee* employee = new Employee;
std::cout << std::endl;
delete person;
delete student;
delete employee;
}
Person's Constructor
Person's Constructor
Student's Constructor
Person's Constructor
Employee's Constructor
Person's Destructor
Student's Destructor
Person's Destructor
Employee's Destructor
Person's Destructor
Person클래스를 부모로 Student와 Employee 파생 클래스를 만들었습니다.
각 클래스는 생성자와 소멸자 및 메소드 하나를 포함하고 있습니다.
생성자를 보면,
각 파생 클래스의 생성자는 부모 클래스의 생성자가 먼저 처리되도록 호출 된다는 것을 확인할 수 있습니다.
A의 파생클래스 B 를 부모로 삼아 다른 파생 클래스 C를 만들 경우,
생성자는 A - B - C의 순으로 처리됩니다.
소멸자는 생성자와는 반대의 순서로 파생 클래스의 소멸자가 먼저 처리됩니다.
여기서 주의할 점은, 동적할당(new)로 만든 인스턴스를 delete로 소멸시킬 경우,
소멸시킬 당시의 '포인터 자료형'을 따라서 소멸자를 호출하게 됩니다.
즉, delete employee;대신 delete ((Person*)employee);을 하게 되면
employee의 Employee소멸자는 호출되지 않고, Person소멸자만 단독으로 호출됩니다.
이를 해결하기 위해서는 추후 등장할 가상 함수를 이용해 소멸자를 가상함수로 지정해야 합니다.