상속의 객체 생성과 소멸 과정에 대해서 알아보자.
가장 중요한 것은
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 |