2011-02-26 43 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方法)。