강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

yahoo님의 프로필 이미지
yahoo

작성한 질문수

홍정모의 따라하며 배우는 C++

11.3 유도된 클래스들의 생성 순서

Child에서 m_i(1) 초기화 안되는 이유가...

작성

·

313

1

class Mother
{
public:
    int m_i;
};

class Child : public Mother
{
public:
    Child()
        : m_i(1024) // <-------------------- error!
    {}
};

 

안녕하세요,
Child에서 m_i(1) 초기화 안되는 이유가, 결국에는 Mother에서 초기화를 이미 했기 때문이라는 것일까요? 아니면 무조건 Mother에서 초기화를 해야한다는 것일까요?

답변 1

2

안녕하세요, 답변 도우미 Soobak 입니다.

첫 번째 말씀하신 내용이 맞습니다.

Initialize List 를 통해서 초기화 를 하시려는 경우,
기반 클래스의 멤버 변수는 기반 클래스에서 이미 한 번 초기화가 진행되었으므로, 다시 초기화를 시도하려고 하면 에러가 발생합니다.

따라서, 초기화는 불가능하지만 아래와 같이 대입은 가능합니다.

class child : public Mother
{
  public:
    child()
    {
        m_i = 1024;
    }
};

 

하지만, 위와 같은 코드는 사실 상 아래와 같이, 기반 클래스 Mother생성자가 숨어있는 것과 같습니다.
(그렇기 때문에, 파생 클래스의 생성자를 호출할 시 기반 클래스의 초기화가 이루어지는 것입니다.)

class child : pulbic mother
{
  public:
    child()
      : Mother()
    {
        m_i = 1024;
    }
}

 

따라서, 파생 클래스에서 명시적으로 기반 클래스의 생성자를 호출하여 기반 클래스의 멤버 변수를 초기화할 수도 있습니다.

class Mother
{
  public:
    int m_i;

    Mother(int i_in = 0)
      : m_i(i_in)
    {}
};


class Child : public Mother
{
  public:
    Child()
      : Mother(1024)  // Mother 클래스의 생성자를 호출하여 m_i를 1024로 초기화
    {}
};

 

 

yahoo님의 프로필 이미지
yahoo
질문자

감사합니다 😀

yahoo님의 프로필 이미지
yahoo

작성한 질문수

질문하기