2012-09-24 106 views
3

我是新來的c + +。這是我第一次使用模板。我想用純虛擬函數來定義某種接口,但這些函數的返回類型可能因派生類而異。所以我想過在抽象類中使用模板。我不確定我所擁有的甚至是有效的。我有類似的東西:從模板抽象類Inserting

template <class T> class InterfaceClass 
{ 
    public:  
    virtual T function1(const string& value)=0; 
    virtual T function2(const MyObj& p)=0; 
} 

因此,我可以從它繼承並定義一個接口來訪問函數。

class myClass : public InterfaceClass<MyObj>{ 
    public: 
     MyObj InterfaceClass::function1(const string& value) 
     { 
      MyObj a = parse(value); 
     } 
     MyObj InterfaceClass::function2(const MyObj& p) 
     { 
       return p; 
     } 
} 

的目的是,我想是可以做一些事情,如:

 InterfaceClass * pClass; 
     if(isCertainType()) 
      pClass = new myClass(); 
     else 
      pClass = new myClass2(); 

編譯器抱怨有InterfaceClass類的重新定義和功能的成員不能在myClass定義。我現在很困惑,想知道這是可能的還是我做錯了什麼。任何幫助深表謝意。

+0

你可以發佈錯誤消息,同時聲明'myClass2'嗎? – juanchopanza

+0

不介意我提到的錯誤。這是因爲我忘了#def頭文件 – Sednus

回答

3

真正的問題是,當您從具有不同參數的模板類繼承到同一模板時,您的類沒有公共基類。 (InterfaceClass<int>InterfaceClass<double>不同的類)。

至於虛擬化,在定義它們時你不需要提供類名。

+0

我還是不明白我該如何修復或解決此問題。 – Sednus

+0

基本上,如果你想使用相同的基礎類可以引用的不同類中的函數有不同的返回類型,那麼你不能做任何事情。 –

+0

如果你想擁有「普通」抽象基類,你可以創建一個基類,從中派生你的類模板並從模板類派生你的類。 –