C++ Chapter 11.2 : Derived Class 들의 생성 순서

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 11. 상속 : Derived Class 들의 생성 순서

  • Derived Class : 자식 클래스

🔔 부모로부터 상속 받은건 온전히 자기 자신의 것이다.

  • 부모로부터 상속 받은 멤버들은 자기 자신의 멤버들이 되기 때문에 this->로 참조하여도 무방하다.
    • 부모 클래스로부터 m_i 멤버 변수를 물려 받은 아래 4개는 다 같은 의미다.
    • 자기 자신의 멤버 변수 중 하나인 m_i 멤버 변수를 나타내는 말이다.
      • m_i
      • this -> m_i
      • Mother::m_i = 1024
      • this -> Mother::m_i = 1024
        • 다만 Mother::멤버 함수 앞에 붙으면 오버라이딩 된 자식 함수 말고 온전히 부모에서 정의함 그 멤버 함수를 의미한다.
class Mother
{
public:
    int m_i;    
};


class Child : public Mother
{
public:
    Child()
    {
        this -> m_i = 10;
        this -> Mother::m_i = 1024;
    }
}


🔔 부모 생성자는 자식 생성자보다 무조건 먼저 호출된다.

class Mother
{
public:
    int m_i; 

    Mother()
        : m_i(0)
    {
        cout << "Mother construction" << endl; 
    }   
};


class Child : public Mother
{
public:
    double m_d;

    Child()
        : m_d(0.0)
    {
        cout << "Child construction" << endl; 
    }
};


int main()
{
    Child c;

    return 0;
}
💎출력💎

Mother construction
Child construction
  • Child c
    • Child 타입의 객체 c를 생성시
      • 위와 같이 자식 생성자에서 부모의 생성자 호출을 직접 명시해주는 부분이 없다면 컴파일러가 부모의 디폴트 생성자를 호출한다.
        • 부모 클래스에 생성자가 아예 정의가 되어 있지 않다면
          • 컴파일러가 빈 내용의 디폴트 부모 생성자를 만들어 호출한다.
        • 부모 클래스에 생성자가 정의가 되있긴 한데 디폴트 생성자는 없다면
          • 에러 발생
      • 부모의 생성자 호출을 직접 명시해주는 부분이 있다면 인수에 맞게 오버로딩되어 해당 생성자를 호출한다.
      • 이후 자식 생성자의 중괄호 부분을 처리한다.

A (할머니) 👉 B(엄마) 👉 C(자식) 순으로 상속이 된다면 C c; C타입의 객체를 만들 때 A 생성자 👉 B 생성자 👉 C 생성자 순으로 호출된다. 가장 부모, 조상인 클래스의 생성자가 먼저 호출된다.


🔔 초기화 리스트에서의 순서

부모 생성자를 먼저 호출하여 부모 멤버의 초기화부터 먼저 한다.

단순히 메모리를 할당하는 것과 초기화하는 것 구분하기! 메모리 할당만 하면 쓰레기값 들어있고 초기화를 하면 할당 받은 메모리 공간에 원하는 값이 들어간다.

Child()
    : m_d(1.0), Mother(1024)
{}

부모 생성자를 자식 생성자의 초기화 리스트에서 직접 호출할 때

메모리 할당은 m_d(1.0)이 먼저 되나 초기화는 되지 않는다. m_d에는 메모리를 할당 받아 쓰레기값만 들어있는 상태에서 Mother(1024)이 호출된다. 부모 생성자에서 m_i 값을 메모리 할당 받고 초기화까지 완료한 상태로 돌아와 그제서야 쓰레기 값이 든 m_d에 1.0이라는 값을 초기화한다. 메모리는 자식이 먼저 할당받을 수도 있지만 초기화에서만큼은 무조건 부모 멤버들이 먼저 초기화가 된다.

Child()
    : m_d(1.0)
{}

부모 생성자를 자식 생성자의 초기화 리스트에서 호출하지 않을 때

이 경우에도 m_d(1.0)를 먼저 메모리 할당 받긴 하지만 1.0으로는 아직 할당되지 않아 쓰레기 값만 들어있는 상태에서 부모 디폴트 생성자 Monter()을 먼저 실행한다. 부모 생성자 호출이 끝난 후 돌아와 그제서야 1.0 값을 할당한다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기