17.3 Order of construction of derived classes

8109 단어 c++_studyc++_study

https://www.learncpp.com/cpp-tutorial/order-of-construction-of-derived-classes/

우리는 전 레슨에서 inheritance의 basic에 대해서 살펴보았다
클래스가 다른 클래스로부터 멤버 변수와 함수를 상속받을 수 있다는 것을 알 수 있었다
이번 섹션에서는 derived class가 instantiate될 때 construction의 순서에 대해서 알아본다

#include <iostream>

class Base
{
public:
    int m_id {};

    Base(int id=0)
        : m_id(id)
    {
        std::cout << "Base\n";
    }

    int getId() const { return m_id; }
};

class Derived: public Base
{
public:
    double m_cost {};

    Derived(double cost=0.0)
        : m_cost(cost)
    {
        std::cout << "Derived\n";
    }

    double getCost() const { return m_cost; }
};

int main()
{
    std::cout << "Instantiating Base\n";
    Base base;

    std::cout << "Instantiating Derived\n";
    Derived derived;

    return 0;
}

Base를 public 상속받는 Derived가 instantiate되면 Base의 constructor가 먼저 호출되고 Derived의 constructor가 다음으로 호출된다
이는 논리적으로 맞는 순서 같다
그리고 상식적으로 안정적으로 생각되어진다
왜냐하면 child class는 parent class의 멤버 변수나 멤버 함수를 사용할 수도 있기 때문에
Base가 먼저 instantiate 되어야 한다고 이해할 수도 있겠다
반면에 parent class는 child class에 대해서 일절 정보를 알 수가 없다.

Order of construction for inheritance chains

class A
{
public:
    A()
    {
        std::cout << "A\n";
    }
};

class B: public A
{
public:
    B()
    {
        std::cout << "B\n";
    }
};

class C: public B
{
public:
    C()
    {
        std::cout << "C\n";
    }
};

class D: public C
{
public:
    D()
    {
        std::cout << "D\n";
    }
};

위의 경우에는 A->B->C->D 순으로 파생되었다

따라서 D를 instantiate 하면 A, B, C, D 순으로 constructor가 실행된다
C++는 항상 first, 혹은 most base 클래스를 가장 먼저 생성한다

좋은 웹페이지 즐겨찾기