와이드용 애드센스


[C++] base 클래스(부모 클래스)의 초기화 순서 C++


[상속 관계에서 클래스의 초기화 순서에 대하여]

Class가 생성될 경우 생성자가 호출된다. 이 클래스가 Base Class (부모 클래스)를 가진다면 유도된 (상속받은) Class 보다 먼저 초기화된다. Base Class의 초기화는 default 생성자를 사용하거나 유도된 Class에 작성된 base Class의 생성자를 사용하여 이루어진다.

그렇다면 다중 상속을 지원하는 C++에서 Base Class가 여러개 있을 경우 어떤 순서로 초기화가 되는 것일까?

다중 상속 Class 초기화 시 호출 순서는 아래의 기준으로 결정된다.
  1. Base Class들이 먼저 호출되는데 상속 시 나열한 순서 (아래 [코드 1]의 경우 30번 줄 참고) 대로 초기화.
  2. Member 객체들의 초기화
  3. 생성자의 Code

아래의 예제와 함께 살펴보자.

[코드 1] Base_Class.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
 
using namespace std;
 
class B {
public:
    B() { cout << "->B"; }
};
 
class C {
public:
    C() { cout << "->C"; }    
};
 
class D {
public:
    D() { cout << "->D"; }
};
 
class E {
public:
    E() { cout << "->E"; }
};
 
class F {
public:
    F() { cout << "->F"; }
};
 
class A : public B, public C, public D {
    E e;
    F f;
    
public:
    A() : C(), B(), e(), f(), D() {
        cout << "->A";
    }
};
 
int main()
{
    cout << "Start";
    A a;
    cout << endl << endl;
    system("pause");
}
cs


클래스 A는 B, C, D를 상속받으며 E F를 멤버 변수로서 가지고 있고,
A()의 생성자 호출 시 Base Class들의 생성자를 호출시키는 내용의 코드이다.



 



[그림 1] 실행 결과


1번 조건에 따라 B -> C -> D 순서로 가장 먼저 초기화되었으며,
2번 조건에 따라 Member 객체인 E, F가 선언 순서인 E->F 순으로 초기화되었으며,
3번 조건에 따라 마지막으로 A가 초기화된 것이다.


참고로, 이 초기화 조건에는 예외가 한가지 존재한다. virtual로 선언된 Base Class가 그것인데, 이 것이 존재할 경우 순서에 약간의 변화가 생긴다.
virtual Base Class들은 다른 non-virtual Base Class가 초기화되기 전에 가장 먼저 초기화된다. 만약 virtual Base Class가 하나 이상 존재할 경우, 선언 순서에 따라 결정된다.


소멸자의 경우 생성자와 동일한 조건을 따르지만, 그 순서가 반대로 돌아간다는 점에 주의해야 한다. 

 


덧글

댓글 입력 영역



애드센스