본문 바로가기
프로그래밍/C++

상속의 객체 생성, 소멸 과정

by 리뷰하는 (게임)프로그래머_리프TV 2010. 3. 26.




상속의 객체 생성과 소멸 과정에 대해서 알아보자.

가장 중요한 것은
Inher_A 클래스를 상속 받은,
Inher_B 클래스를 생성할때,
A클래스의 생성자를 먼저 들린 후,
B클래스의 생성자를 수행한다는 것이다.
일단 소스를 보자.

#include <iostream>

class Inher_A
{
public:
	Inher_A()
	{
		std::cout << "Inher_A()" << std::endl;
	}
	Inher_A(char a)
	{
		std::cout << "Inher_A(char a)" << std::endl;		
	}
	Inher_A(int a)
	{
		std::cout << "Inher_A(int a)" << std::endl;
	}
	Inher_A(int a, int b, int c)
	{
		std::cout << "Inher_A(int a, int b, int c)" << std::endl;
	}
	~Inher_A()
	{
		std::cout << "~Inher_A()" << std::endl;
	}
};

class Inher_B : public Inher_A
{
public:
	// Inher_B를 해주면 각 타입에 따라서 생성자에 들어 가지만,
	// 생성자는 거치기만 할 뿐,
	// 실제로는 Inher_A의 생성자를 먼저 들어 가게 된다.
	Inher_B()
	{
		std::cout << "Inher_B()" << std::endl;		
	}
	Inher_B(char b)
	{
		std::cout << "Inher_B(char b)" << std::endl;
	}
	// 기본적으로 Inher_B->Inher_A()에 생성자를 들르지만
	// 다음 처럼 선언하여 Inher_A(int )로 이동이 가능하다.
	Inher_B(int b) : Inher_A(b)
	{
		std::cout << "Inher_B(int b) : Inher_A(b)" << std::endl;
	}
	// 위 내용과 비슷 Inher_A(int, int, int) 생성자에 들르기 위해서 존재
	Inher_B(int a, int b, int c) : Inher_A(a,b,c)
	{
		std::cout << "Inher_B(int a, int b, int c) : Inher_A(a,b,c)" << std::endl;
	}
	// 생성은 A->B 순이지만 소멸은 B->A 순이다.
	~Inher_B()
	{
		std::cout << "Inher_B()" << std::endl;
	}
};

void main()
{
	std::cout << "Inher_B b;" << std::endl;
	Inher_B b;
	std::cout << std::endl;

	std::cout << "Inher_B b_1('t');" << std::endl;
	Inher_B b_1('t');
	std::cout << std::endl;

	std::cout << "Inher_B b_2(10);" << std::endl;
	Inher_B b_2(10);
	std::cout << std::endl;

	std::cout << "Inher_B b_3(10,20,30);" << std::endl;
	Inher_B b_3(10,20,30);
	std::cout << std::endl;

	// 생성 순서 a -> b
	// 소멸 순서 b -> a
}​



소스에서도 알 수 있듯이 가장 중요한 것은
생성 순서는 최상위 클래스에서 단계별 하위 클래스로 이루어 지고.
소멸 순서는 취하위 클래스에서 단계별 상위 클래스로 이루어 진다는 것을 알 수 있다.
또한 기본적으로 상위 클래스의 생성자 선택은 멤버 이니셜라이저를 사용,
원하는 생성자로 이동이 가능하다.(아무것도 존재 하지 않는다면, 인자를 받지 않는 생성자를 수행.

'프로그래밍 > C++' 카테고리의 다른 글

IS-A, HAS-A 관계  (1) 2010.03.27
상속의 형태  (0) 2010.03.26
상속의 개념  (0) 2010.03.24
public: private: 그리고 protected:  (0) 2010.03.24
explicit, mutable  (0) 2010.03.24