● 파생 클래스와 기본 클래스의 생성자 호출 및 실행
Q1) 파생 클래스의 객체가 생성될 때, 파생 클래스의 생성자와 기본 클래스의 생성자가 모두 실행되는가?
-> 둘 다 실행된다. 파생 클래스, 기본 클래스 모두 각각의 멤버 초기화나 필요한 초기화를 각각 수행한다.
Q2) 파생 클래스의 생성자와 기본 클래스의 생성자 중에서 누가 먼저 실행되는가?
-> 기본 클래스의 생성자가 먼저 실행된다.
다음을 보자.
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 | #include <iostream> using namespace std; class A { public: A() { cout << "생성자 A" << endl; } ~A() {cout << "소멸자 A" << endl; } }; class B : public A { public: B() { cout << "생성자 B" << endl; } ~ B() {cout << "소멸자 B" << endl; } }; class C : public B { public: C() { cout << "생성자 C" << endl; } ~ C() { cout << "소멸자 C" << endl; } }; int main() { C c; // 객체 c 생성 return 0; // 객체 c 소멸 } | cs |
C c;
에서 파생 클래스의 생성자가 먼저 호출되지만, 결국 기본 클래스의 생성자가 먼저 실행되고 나서야 파생 클래스의 생성자가 실행된다.
why? : 파생 클래스의 생성자에서 기본 클래스의 생성자를 호출할 때 인자 값을 전달해야 하기 때문이다.
● 소멸자의 실행 순서
: 생성자의 실행 순서와 반대로 실행된다.
why? : 파생 클래스의 소멸자 코드를 실행한 후 기본 클래스의 소멸자를 호출하도록 컴파일 하기 때문이다.
● 파생 클래스에서 기본 클래스 생성자 호출
파생 클래스를 작성하는 개발자는 함께 실행할 기본 클래스의 생성자를 지정하여야 한다.
하지 않을 경우, 묵시적으로 기본 클래스의 기본 생성자가 실행되도록 컴파일한다.
※ 만일 기본 생성자가 선언되어 있지 않으면 '사용할 수 있는 적절한 기본 생성자가 없습니다. ' 라는 오류를 발생시킨다.
아래는 명시적으로 생성하는 경우의 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <iostream> using namespace std; class A { public: A() { cout << "생성자 A" << endl; } A(int x) { cout << "매개변수생성자 A" << x << endl; } }; class B : public A { public: B() { // A() 호출하도록 컴파일됨 cout << "생성자 B" << endl; } B(int x) : A(x+3) { cout << "매개변수생성자 B" << x << endl; } }; int main() { B b(5); } | cs |
명시적으로 기본 생성자 호출 코드를 작성하지 않는 경우 컴파일러가 다음과 같이 기본 생성자 호출 코드를 삽입한다.
1 2 3 4 5 6 7 8 | class B { B() : A() { cout << "생성자 B" << endl; } B(int x) : A() { cout << "매개변수생성자 b" << x << endl; } }; | cs |
'C++ > C++ 문법' 카테고리의 다른 글
#09 - 1 가상함수와 추상 클래스 (1) | 2018.10.08 |
---|---|
#8-5 가상 상속 (0) | 2018.10.07 |
#8-2 상속과 객체 포인터 (0) | 2018.10.07 |
#8-1 상속 (0) | 2018.10.07 |
#7-B 연산자 중복 (0) | 2018.10.07 |