2017-12-08 4 views
1

파생 클래스를 가리키는 상위 클래스 포인터에서 새 메모리 위치가있는 새 파생 클래스 포인터를 가져 오려고합니다.다른 클래스를 기반으로하는 새 파생 형식 만들기

#include <iostream> 
#include <random> 
class parent{ 
public: 
    virtual void print(){ 
     printf("p\n"); 
    } 
}; 

class dev1: public parent{ 
public: 
    void print(){ 
     printf("d1\n"); 
    } 
}; 

class dev2:public parent{ 
public: 
    void print(){ 
     printf("d2\n"); 
    } 
}; 

int main(int argc, const char * argv[]) { 
    srand(time(NULL)); 

    parent*bob; 

    if(rand()%2){ 
     bob = new dev1(); 
    }else{ 
     bob = new dev2(); 
    } 
    bob->print(); 

    parent * bobwannabe; 

    bobwannabe = new typeof(*bob); 

    bobwannabe->print(); 

    return 0; 
} 

나는 bobwannabe 지문을 밥 무엇을 인쇄 할 것 기대했다. bobwannabe는 bob과 동일한 객체를 가리켜서는 안되며 bob과 동일한 클래스 여야합니다.

지금은 보버 위브가 새로운 부모가됩니다. 현재 유형의 새 밥으로 바꿀 수있는 방법이 있습니까? 아니면 검색해야하는 특정 용어가 있습니까? 감사합니다.

+1

이렇게 할 수 없습니다. 'new' 문의 타입은 정적입니다. 의미, 그것은 컴파일 시간에 알려 져야합니다. 아래의 대답에 요약 된 것처럼 복제 기능은 문제에 대한 대중적인 해결책입니다. –

+1

전혀 검색 했습니까? 예 : [파생 클래스 인스턴스를 포인터에서 다형 기본 클래스로 복사/작성하는 방법] (https://stackoverflow.com/questions/5731217/how-to-copy-create-derived-class-instance-from-a- polymorphic-base-c)/[파생 된 C++ 클래스가 기본 포인터를 통해 어떻게 복제 될 수 있습니까?] (https://stackoverflow.com/questions/3136646/how-can-a-derived-c) -class-clone-itself-via-a-base-pointer)/[C++는 기본 클래스를 호출하여 파생 클래스를 우아하게 복제합니다.] (https://stackoverflow.com/questions/36189838/c-elegantly-clone-derived-class- by-call-base-class) –

답변

1

원하는 것은 개체를 복제하는 것입니다. 당신은 가상 복제 방법을 추가하여 직접 할 필요가 부모 클래스에 생성자를 복사

virtual parent * clone() const { return new parent(*this); } 

그리고 dev1에 대한 같은 모든 파생 클래스에서 오버라이드 (override) :

virtual parent * clone() const override { return new dev1(*this); } 

와 함께 사용

parent *bobwannabe = bob->clone(); 

'typeid' versus 'typeof' in C++ 참조 개체를 삭제하거나 스마트 포인터를 사용하는 것을 잊지 마세요.

+2

팁 : 'new auto (* this)'를 사용하면 수동으로 타이핑하지 않아도됩니다. 하지만 원시 소유 포인터 대신에'std :: unique_ptr'을 사용해야합니다. 어쨌든 [CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)는 모든 클래스에서이 '복제'기능을 주입하는 완벽한 도구입니다. – Quentin

관련 문제