2013-04-07 3 views
3

상속 문제가 발생했습니다. 내 솔루션이 우아한 지 모르겠습니다. 이 클래스가 있습니다클래스 멤버 변수를 오버라이드

class Var 
{ 
public: 
    virtual void doSomething(); 
} 
class DerivedVar : public Var 
{ 
public: 
    virtual void doSomething(); 
    void doSomethingElse(); 
} 

또한 MyBase를 상속 한 MyDerived도 있습니다. MyBase에는 Var 유형의 멤버가 있지만 MyDerived에는 DerivedVar 멤버가 있어야하므로 doSomething()을 호출 할 수 있습니다. 현재, 나는이 작업을 수행 할 수있는 더 좋은 방법이 있는지 알고 싶어이 문제를

template<typename VarType> 
class MyBase 
{ 
protected: 
    VarType var; 
public: 
    MyBase() { var.doSomething(); } 
} 

class MyDerived : public MyBase<DerivedVar> 
{ 
public: 
    MyDerived() : MyBase() { var.doSomethingElse(); } 

} 

를 해결하기 위해 템플릿을 사용하고 있습니다 (예. 템플릿 사용의 필요없이) 당신이 원하는 또는 필요한 경우

+1

잘 모르는 경우 CRTP에 대한 정보를 찾을 수 있습니다. – chris

+0

음 ... 힙에 간접 지정 및 할당 수준을 추가 할 필요가 없다면 항상 포인터를 저장할 수 있습니다 ... – StoryTeller

답변

1

을 템플릿을 사용하지 않으면 공변 유형 데이터 멤버를 동적으로 할당해야합니다.

좋은 방법은 생성자 체인 (기본 생성자 인수가 될 수 있음)을 팩터 리로 전달하고 기본 클래스에서이를 호출하는 것입니다.

좋지 않은 접근 방식이지만 1990 년대 초반에 매우 인기가 있었지만 2 단계 초기화를 사용했습니다.

그래, 아직 실행되지 않은 문제가 예상됩니다.

하지만 그렇게됩니다. ;-)

그렇다면 템플릿 접근 방식이 효과적 일 수 있다면 가장 좋습니다.

대부분의 직접 솔루션, 최소한의 해결 방법 및 코드 및 디자인 수정.

관련 문제