2017-12-24 16 views
0
, 나는이 기능을 만들고 싶어

반환 유형 B <T> 반면 원래 ()는 A을 반환합니다. 재정의 반환 형식은

나는이 시도하지만 컴파일러는 내가 추상 클래스 반환 할 수 없어 말하고있다 : 나는 A의에서 내가 A *B <을 반환하지 않는 한이 T > * 수 없습니다 생각

class A 
{ 
public: 
    virtual A Clone() const = 0; 
}; 

template <typename T> 
class B : public A 
{ 
private: 
    T value; 
public: 
    B<T> Clone() const override 
    { 
     return B<T>(value); 
    } 
}; 

을 Clone과 B 's Clone은 힙에 이것을 만들고 싶지 않습니다. 이것을 할 수있는 방법이 있습니까? (가능한 경우 모두에 복제본을 쓸 위치를 가리키는 포인터를 갖고 싶지 않습니다.)

참고 : 나는 생성자와 같은 "노이즈"중 일부를 제거했습니다.

+0

* 그러나 힙에서 생성하고 싶지 않습니다. * 포인터는 힙과 아무 관계가 없습니다. – PaulMcKenzie

+0

나는 그것을 이해하지만, B 을 돌려주고 싶다. – Matthew

+0

A의 복제본에서 B 을 반환하고 필드가없는 B 을 무시할 수 있습니까? – Matthew

답변

0

아니요, 값으로 설정할 수 없습니다. 값에는 구체적이고 고정 된 저장소와 유형이 있습니다.

std::function과 같은 다형성 값 유형을 만들 수 있지만 상속을 구현 세부 정보로만 사용합니다 (기껏해야).

std::any은 거의 인터페이스가없는 다형성 값 유형입니다. 내용의 크기에 따라 SBO 또는 힙을 사용합니다. 추가 인터페이스로이를 확장하는 것은 그리 어렵지 않습니다.