2009-09-30 72 views
8

我無法弄清楚這一點。我需要有一個抽象的模板基類, 如下:指向抽象模板基類的指針?


template <class T> class Dendrite 
{ 
    public: 
     Dendrite() 
     { 
     } 

     virtual ~Dendrite() 
     { 
     } 

     virtual void Get(std::vector<T> &o) = 0; 

    protected: 
     std::vector<T> _data; 
}; 

現在,我從這個指定枝蔓的確切用法派生。

現在的問題。

如何創建指向基類的指針而不指定類型,我想通過稍後將元素推送到指定的類型來指定它?類似於:


class Foo 
{ 
    public: 
     ... 

    private: 
     std::vector<Dendrite *> _inputs; //!< Unfortunately, this doesn't work... 

     //! Now I could later on push elements to this vector like 
     //! 
     //! _inputs.push_back(new DeriveFromDendrite<double>()) and 
     //! _inputs.push_back(new DeriveFromDendrite<int>()). 
}; 

這是可能的還是我缺少一些非常基本的東西?

template <class T> class Dendrite : public IDendrite 
{ 
     public: 
       Dendrite() 
       { 
       } 

       virtual ~Dendrite() 
       { 
       } 

       void Get(std::vector<T> &o) = 0; 

     protected: 
       std::vector<T> _data; 
}; 

,然後你IDendrite類可以存儲爲指針:

+0

類似:http://stackoverflow.com/questions/1479498/how-to-subclass-a-templated-base -類 – 2009-09-30 13:12:15

回答

14

通常,這是由你的模板從一個接口類繼承,IE做

std::vector<IDendrite*> m_dendriteVec; 

然而,在你的情況下,您將模板參數作爲界面的一部分。您可能還需要包裝這也。

class IVectorParam 
{ 
} 

template <class T> 
class CVectorParam : public IVectorParam 
{ 
    std::vector<T> m_vect; 
} 

給你

class IDendrite 
{ 
    ... 
public: 
    virtual ~IDendrite() 
    virtual void Get(IVectorParam*) = 0; 
} 

template <class T> class Dendrite : public IDendrite 
{ 
    ... 
    // my get has to downcast to o CVectorParam<T> 
    virtual void Get(IVectorParam*); 
}; 
0

是的,它是可能的。只要確保提供虛擬功能和虛擬析構函數。另外,你可以使用typeid來獲得實際的類型(以及dynamic_cast來檢查類型)