C++ 에서 클래스간에 상속이 이루어질 때 생성자에 관한 간단한
글쓴이: vudghkzm / 작성시간: 목, 2005/02/24 - 6:59오후
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]
Forums:
정리하면
subclass 의 생성자에서 subclass 의 Set() 함수를 call 하려는데
그걸 superclass 를 이용해서 어찌할 방법이 있을까요?
제가 볼때는 불가능하다고 보이네요.
근데 굳이 그렇게 하시려는 이유는?
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
girneter님 말씀대로 불가능합니다.[url]http://www.
girneter님 말씀대로 불가능합니다.
http://www.research.att.com/~bs/bs_faq2.html#vcall을 참고하세요.
가상함수 호출은 객체가 다 만들어진 이후에 해야합니다.생성자에서 가상
가상함수 호출은 객체가 다 만들어진 이후에 해야합니다.
생성자에서 가상함수 호출은 객체가 만들어진 과정에서
호출되는 것이기 때문에, 객체의 메모리 레이아웃에서
vptr이 가리키는 메모리 주소가 실제 객체가 다 만들어진후의
vtable의 주소가 아니죠.
따라서, 생성자에서 가상함수 호출을 위해서는 조금은 우회적인 방법이 필요합니다.
http://mindview.net/Books/TICPP/ThinkingInCPP2e.htm
에서 디자인패턴의 virtual constructor 부분을 찾아보시기 바랍니다.
[quote="kihongss"]따라서, 생성자에서 가상함수 호출을 위해
좀 오해의 소지가 있어서 첨언합니다. virtual constructor나 factory는 다형적인
클래스 개체를 생성하기 위한 패턴이며, 부모 클래스의 생성자 내에서 자식 클래스의
가상 함수를 호출하는 것은 아닙니다.
[quote="doldori"][quote="kihongss"]따라서,
제가 얘기하고 싶었던 것은 링크를 따라가셔서 virtual constructor 부분을 읽어보시라는 겁니다. 링크의 예제에서 virtual constructor를 구현하는 과정에서 부모클래스의 생성자에서 가상함수를 호출하고 있으니까요.
이것도 object life time에 관련된 얘기군요.http://
이것도 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로 사용될 수 없다는 해석이 더 맞을 듯 하군요.
댓글 달기