작성
·
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로 초기화
{}
};
감사합니다 😀