What is a “virtual constructor”?

Tags:

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8

왜 이런 짓을 하는가.. 에 대한 이유는, constructor에서 virtual method call 을 하면 제대로 안되기 때문. 예를들어

#include

using namespace std;

class A
{
public:
A() { foo(); }
virtual void foo() {
cout << "A" << endl; } }; class B: public A { public: B() { } virtual void foo() { cout << "B" << endl; } }; int main() { A *a = new B; delete a; return 0; } [/code] 의 결과는 A이다. B가 아니라.. 왜냐하면 아직 A의 생성중에는 B가 존재하지 않을 것이고, 따라서 B의 foo()를 부르는건 말이 안되기때문. 마찬가지로, destructor에서도 virtual을 호출해서는 안된다. 왜냐하면 자식이 먼저 소멸해버린 뒤, 부모의 destructor가 불릴 것이고 그땐 이미 자식의 인스턴스는 없으니까. 해결책은 (1) clone이나 create같은 메소드를 만들고 이 메소드 자체가 virtual이게 하는 방법이 있고, (2) constructor에서는 non-virtual method를 부르고 이 non-virtual이 virtual을 부르게 하는 방법도 있고, (3) 발상을 바꿔서 하부단의 일을 왕창 부모 클래스로 옮겨버린다음 자식이 데이터를 이쁘게 만들어 부모에게 주는 방법도 있다. 뒤의 두가지 방법은 http://www.artima.com/cppsource/nevercall.html 참고.

Comments

2 responses to “What is a “virtual constructor”?”

  1. trax Avatar
    trax

    오오 멋지게 정리하고 있어서 좋음… ^^ Great Jobs!!

  2. MKSeo Avatar
    MKSeo

    감사 ㅎㅎ

Leave a Reply

Your email address will not be published. Required fields are marked *