IT 프로그래밍/C++

[따배시 11.1 c++] 상속의 기본1

기술1 2024. 5. 26. 21:06
반응형

Constructor를 해주는 이유는 메모리가 할당될 때 initializer를 해주기 위한 것입니다. 

 

class Mother
{
public:
	int m_i;
};

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

이렇게 상속을 받은 것을 this -> 로도 가능합니다.  상속을 받으면 자기 거가 되는 것입니다. 하지만 초기화는 불가능한데요.

 

 

 

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

여기서 초기화를 하면 오류가 발생합니다. 왜 초기화는 안되냐고 생각을 할 수 있습니다. 

 

 

#include <iostream>
using namespace std;


class Mother
{
public:
	int m_i;

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

class Child : public Mother
{
public:
	double m_d;

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

int main()
{
	Child c1;


	return 0;
}

이렇게 했을 때 mother construction 다음 child construction이 일어납니다. Child c1으로 해줬는데 왜 이렇게 일어나는 것일까요?

 

내부적으로 child는 mother가 가지고 있는 것을 다 사용할 수 있기 때문에 mother을 다 초기화 한 다음에 child를 초기화합니다. 즉 mother가 상위 순서이기 때문에 당연히 mother 부터 초기화를 해주는 것입니다.

 

그렇기 때문에 mother 가 초기화 되기 전에 m_i(1)를 child에 초기화를 할 수 없는 것입니다. initialization을 list에서 할 수는 없지만 mother() 에서 초기화가 끝난 다음에 

class Child : public Mother
{
public:
	double m_d;

public:
	Child()
		: m_d(1.0)
	{
		m_i = 1024;
		cout << "Child construction " << endl;
	}
};

이런식에 코드 안에 mother class의 m_i를 넣어줄 수 있습니다. (물론 m_i 는 public과 protected 일 때 가능합니다) 그럼 m_i를 초기화를 할 때 다른 값으로 하고 싶거나 강제로 mother의 construction을 할 수 있냐고 생각할 수 있습니다.

 

class Child : public Mother
{
public:
	double m_d;

public:
	Child()
		: Mother(), m_d(1.0)
	{
		cout << "Child construction " << endl;
	}
};

코드에는 항상 Mother() 이것을 생성해주지 않아도 존재합니다. 우리가 눈에 보이지 않을 뿐 compiler는 항상 이런 식으로 컴파일러를 하고 있는 것입니다. 따라서 child를 생성할 때는 항상 mother가 먼저 나오게 됩니다.

 

이 순서가 바껴서 m_d(1.0), Mother() 이어도 Mother() 을 먼저 실행합니다. 

 

헷갈리신다면 직접 debug를 하셔서 찾아보시면 됩니다. 

 

 

class A
{
public:
	A()
	{
		cout << "A constructor" << endl;
	}

};

class B : public A
{
public:
	B()
	{
		cout << "B constructor" << endl;
	}

};

class C : public B
{
public:
	C()
	{
		cout << "C constructor" << endl;
	}
};


int main()
{
	C c;
	return 0;
}

이렇게 나오게 됩니다.

 

Destructor 같은 경우 반대로 가게 됩니다. 

반응형