하위 클래스의 copy ctor에서 상위 클래스의 copy ctor를 호출해 주는 방법

gilgil의 이미지

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 cotor가 호출이 될 때에는 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를 호출하게 되어 있다.

출처 : http://www.gilgil.net/15955

Forums: 

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.