C++ 에서 클래스간에 상속이 이루어질 때 생성자에 관한 간단한

vudghkzm의 이미지

2가지 종류의 코드가 다음과 같습니다.

[Parent.h 파일]
Class Parent
{
public:
  Parent();
  Parent(int a);
  virtual ~Parent();

  virtual void Set(int a);
}

[Parent.cpp 파일]
Parent::Parent() { }
Parent::Parent(int a) { Set(a); }
Parent::~Parent() { }

void Parent::Set(int a) { }


[Child.h 파일]
Class Child : public Parent
{
public:
  Child();
  Child(int a);
  virtual ~Child();

  void Set(int a);
}

[Child.cpp 파일]
Child::Child() { }
Child::Child(int a) : Parent(a) { } // <- 다른 부분
Child::~Child() { }

[Parent.h 파일]
Class Parent
{
public:
  Parent();
  Parent(int a);
  virtual ~Parent();

  virtual void Set(int a);
}

[Parent.cpp 파일]
Parent::Parent() { }
Parent::Parent(int a) { Set(a); }
Parent::~Parent() { }

void Parent::Set(int a) { }


[Child.h 파일]
Class Child : public Parent
{
public:
  Child();
  Child(int a);
  virtual ~Child();

  void Set(int a);
}

[Child.cpp 파일]
Child::Child() { }
Child::Child(int a) { Set(a); } // <- 다른 부분
Child::~Child() { }

void Child::Set(int a) { ... }

제가 의도하는 바는 아래쪽 코드입니다.
그래서 상속을 이용해서 위쪽의 코드와 같이 나타내보았는데 아래쪽과 같지 않네요. ^^;
(정확히 말씀드리면 아래쪽 코드의 생성자 Child(int a) 가 나타내는 바를 위쪽 코드에서 똑같이 구현해보려고 했습니다.)

아래쪽 코드와 동일하게 만들려면 위쪽 코드를 어떻게 수정해야 하는지요?[/code]

girneter의 이미지

subclass 의 생성자에서 subclass 의 Set() 함수를 call 하려는데
그걸 superclass 를 이용해서 어찌할 방법이 있을까요?

제가 볼때는 불가능하다고 보이네요.

근데 굳이 그렇게 하시려는 이유는?

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

doldori의 이미지

girneter님 말씀대로 불가능합니다.
http://www.research.att.com/~bs/bs_faq2.html#vcall을 참고하세요.

kihongss의 이미지

가상함수 호출은 객체가 다 만들어진 이후에 해야합니다.
생성자에서 가상함수 호출은 객체가 만들어진 과정에서
호출되는 것이기 때문에, 객체의 메모리 레이아웃에서
vptr이 가리키는 메모리 주소가 실제 객체가 다 만들어진후의
vtable의 주소가 아니죠.
따라서, 생성자에서 가상함수 호출을 위해서는 조금은 우회적인 방법이 필요합니다.

http://mindview.net/Books/TICPP/ThinkingInCPP2e.htm
에서 디자인패턴의 virtual constructor 부분을 찾아보시기 바랍니다.

doldori의 이미지

kihongss wrote:
따라서, 생성자에서 가상함수 호출을 위해서는 조금은 우회적인 방법이 필요합니다.

http://mindview.net/Books/TICPP/ThinkingInCPP2e.htm
에서 디자인패턴의 virtual constructor 부분을 찾아보시기 바랍니다.


좀 오해의 소지가 있어서 첨언합니다. virtual constructor나 factory는 다형적인
클래스 개체를 생성하기 위한 패턴이며, 부모 클래스의 생성자 내에서 자식 클래스의
가상 함수를 호출하는 것은 아닙니다.
익명 사용자의 이미지

doldori wrote:
kihongss wrote:
따라서, 생성자에서 가상함수 호출을 위해서는 조금은 우회적인 방법이 필요합니다.

http://mindview.net/Books/TICPP/ThinkingInCPP2e.htm
에서 디자인패턴의 virtual constructor 부분을 찾아보시기 바랍니다.


좀 오해의 소지가 있어서 첨언합니다. virtual constructor나 factory는 다형적인
클래스 개체를 생성하기 위한 패턴이며, 부모 클래스의 생성자 내에서 자식 클래스의
가상 함수를 호출하는 것은 아닙니다.

제가 얘기하고 싶었던 것은 링크를 따라가셔서 virtual constructor 부분을 읽어보시라는 겁니다. 링크의 예제에서 virtual constructor를 구현하는 과정에서 부모클래스의 생성자에서 가상함수를 호출하고 있으니까요.

JosephJang의 이미지

이것도 object life time에 관련된 얘기군요.
http://www.gotw.ca/gotw/080.htm

정확히 이 상황을 언급하고 있는 좋은 글이 있죠.
http://sparcs.kaist.ac.kr/~ari/each/article.each.607.html

(Virtual ctor라기보다는) constructor가 Template method로 사용될 수 없다는 해석이 더 맞을 듯 하군요.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.