2015-01-15 53 views
0

我想製作一個模板對象的列表,這些對象在基類的不同子類之後模板化。我知道列表不能是異構的,因此在這些基類的列表後鍵入我的模板列表。實例化基類模板列表中的子類對象

查看下面的基本代碼。當我嘗試從模板中實例化實現時,問題就出現了,因爲它仍然假設我使用抽象基類,儘管我已經在模板參數中傳遞了它的子類。

這一切都在標題中完成。

// Base Class 
class MyBase { 
public: 
    MyBase(int a) {} 

    virtual void Print() = 0; 
}; 

// Subclass ONE 
class MySub_One : 
    public MyBase 
{ 
public: 
    MySub_One(int a) 
     : MyBase(a) {} 

    virtual void Print() override { printf("Sub One\n"); } 
}; 

// Subclass TWO 
class MySub_Two : 
    public MyBase 
{ 
public: 
    MySub_Two(int a) 
     : MyBase(a) {} 

    virtual void Print() override { printf("Sub Two\n"); } 
}; 



// Template Class 
template <class T> 
class MyTemplate 
{ 
    int numPrint; 

    void CreateAndPrint() 
    { 
     T* obj = new T(0); // Compiler says, "error C2259: 'MyBase' Cannot instantiate abstract class." 

     obj = dynamic_cast<MyBase>(obj); 
     obj->Print(); 
    } 
}; 

當我一個子類對象後添加到一個基類列表中,還有一個問題:

list<MyTemplate<MyBase>*> testList = list<MyTemplate<MyBase>*>(); 
testList.push_back(new MyTemplate<MySub_One>()); // This is a problem too 

是什麼原因導致這兩個錯誤?有什麼辦法可以做到這一點?

回答

2

有幾個問題。

  1. MyTemplate<MyBase>不是一個基類的MyTemplate<MySub_One>

  2. 您正在嘗試MyTemplate<MySub_One>*類型的指針添加到應該持有MyTemplate<MyBase>類型的對象的列表清單。

你需要的東西,如:

class TemplateBase 
{ 
    public: 
    virtual void CreateAndPrint() = 0; 
}; 

template <class T> 
class MyTemplate : public TemplateBase 
{ 
    public: 
    virtual void CreateAndPrint() 
    { 
     T* obj = new T(0); 
     obj->Print(); 
    } 
}; 

list<TemplateBase*> testList; 
testList.push_back(new MyTemplate<MySub_One>()); 
+0

1.這實際上是一個錯字 - 原來是指針的列表。將指針添加到上面的代碼沒有任何區別。但是... 2.我會試試看 - 看起來很有前途。 – JordanBell