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]

copy_ctor_test.zip