A라는 클래스가 있습니다. default constructor(이하 ctor), copy ctor, destructor(이하 dtor)에 코드가 명시되어 있습니다.
class A
{ public: A() { printf("A::A()\n"); } // (A1) virtual ~A() { printf("A::~A()\n"); } // (A2) A(const A& rhs) { printf("A::A(A)\n"); } // (A3) };
A에서 상속을 받은 B라는 클래스가 있으며, B 클래스 또한 default ctor, copy ctor, dtor 코드가 명시되어 있습니다.
class B : public A { public: B() { printf("B::B()\n"); } // (B1) virtual ~B() { printf("B::~B()\n"); } // (B2) B(const B& rhs) { printf("B::B(B)\n"); } // (B3) };
B클래스의 객체 하나를 선언해 보겠습니다.
{ B b1; }
이 코드에서는 객체가 생성이 될 때에는 (A1) > (B1) 이 호출이 되고 객체개 해제될 때에는 (B2) > (A2) 순으로 호출이 되겠죠.
그럼 B클래스의 copy ctor를 호출하게 되는 또 다른 객체 하나를 선언해 보겠습니다.
{ B b2(b1); }
이때에는 어떤 코드가 호출이 될까요?
1번 : (A1) > B(3)
2번 : A(3) > B(3)
테스트 결과 정답은 1번이 되겠습니다. ctor가 호출이 될 때에는, 자기보다 상위 클래스의 ctor를 먼저 호출해 줘야 한다는 전제 조건이 있는데, 상기 코드에서 B의 copy ctor가 호출이 될 때에는 A의 copy ctor가 호출이 되지 않고 A의 default ctor가 호출이 되게 됩니다.
그럼 B의 copy ctor가 호출이 될 때 A의 copy ctor가 호출이 되게 하려면 어떻게 하면 될까요? 정답은 간단합니다. B클래스에서 코드상으로 명시를 해 주면 됩니다.
class B : public A { public: B() { printf("B::B()\n"); } virtual ~B() { printf("B::~B()\n"); } B(const B& rhs) : A(rhs) { printf("B::B(B)\n"); } };
(명시하지 않을 경우) 하위 클래스의 copy ctor에서는 상위 클래스의 copy ctor를 호출해 주는 것이 아니라 default ctor를 호출하게 되어 있다.
[Download]