Qaupot Blog
Software Engineering, Trip

402. 생성자와 소멸자의 상속시 동작

🕐 Tue, 11 Mar 2014 09:00:00 GMT

파생 클래스의 생성자와 소멸자의 동작

생성자와 소멸자는 다소 특별한 멤버함수입니다. 클래스의 생명주기에 관여하며,
해당 클래스가 생성될때와 소멸될때 무슨 행동을 해야 할지를 지정하는 역할입니다.
이에 다른 멤버 함수들과는 상속시에 조금 다른 규칙을 가지고 있습니다.

#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소멸자만 단독으로 호출됩니다.

이를 해결하기 위해서는 추후 등장할 가상 함수를 이용해 소멸자를 가상함수로 지정해야 합니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.