2011-02-26 1 views
0

템플릿을 사용하여 다중 상속에 대한 대안으로 혼합 기능을 구현할 때 모든 코드가 헤더 파일에 있어야한다는 문제가 있습니다. 나는 그 문제를 해결하기 위해 추상 기본 클래스를 사용하려고 생각하고있다. 코드 샘플은 다음과 같습니다.추상 기반을 사용하여 템플릿 클래스의 개인 부분을 구현합니까?

class Widget 
{ 
public: 
    virtual ~Widget() {} 
}; 

// Abstract base class allows to put code in .cpp file. 
class AbstractDrawable 
{ 
public: 
    virtual ~AbstractDrawable() = 0; 

    virtual void draw(); 

    virtual int getMinimumSize() const; 
}; 

// Drawable mix-in 
template<class T> 
class Drawable : public T, 
       public AbstractDrawable 
{ 
public: 
    virtual ~Drawable() {} 

    virtual void draw() 
    { AbstractDrawable::draw(); } 

    virtual int getMinimumSize() const 
    { return AbstractDrawable::getMinimumSize(); } 
}; 

class Image : public Drawable<Widget> 
{ 
}; 


int main() 
{ 
    Image i; 
    i.draw(); 
    return 0; 
} 

누구나 전에 그 길을 걸었습니까? 내가 알아야 할 함정이 있습니까?

답변

1

mixin 클래스의 동작을 템플릿 인수에 의존 할 수있는 능력을 잃어 버리기 때문에 원하는 방식으로 작동하지 않는 것처럼 보입니다. 즉, 정적 다형성을 사용하는 기능을 혼합하거나 템플릿 인수에서 클래스를 참조하는 경우 템플릿 인수에 관계없이 동일한 코드가 실행되기 때문에 더 이상 그렇게 할 수 없습니다.

그러나 믹싱 유형이 템플릿 인수에 의존하지 않는 경우에는 괜찮습니다. 그러나, 당신이 정적으로 어떤 함수를 호출하는지 (즉, AbstractDrawable 메소드)를 결정할 수 있기 때문에 nonvirtual에서 혼합되는 함수를 만들 수 있습니다.

관련 문제