C++ Chapter 11.2 : Derived Class 들의 생성 순서
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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 값을 할당한다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기