2012-10-13 44 views
1

在C++中,我想一個類轉換到另一個類,所以我決定創建一個模板類,但我有一個編譯錯誤,這裏是錯誤,虛函數覆蓋預期錯誤

"MyFooClass.h", line 10: error (etoa:4997): 
     function "IFoo::show(OtherClass &)" is hidden by 
     "MyFooClass::show" -- virtual function override 
     intended? 
    virtual std::auto_ptr<ClNewClass> show(ClOldClass &oc) 

這裏是我的代碼,

//IFoo.h 
class IFoo 
{ 
    public: 
     virtual ~IFoo(){} 

    protected: 
     virtual std::auto_ptr<OtherClass> show(OtherClass &oc) = 0; 
}; 

//CustomFoo.h 
template<typename oldClass, typename newClass> 
class CustomFoo : public IFoo 
{ 
    public: 
     virtual std::auto_ptr<newClass> show(oldClass &oc)=0; 

    protected: 
     virtual std::auto_ptr<OtherClass> show(OtherClass &oc) 
     { 
      std::auto_ptr<OtherClass> result(show(static_cast<oldClass &>(oc))); 
      return result; 
     } 
}; 

//MyFooClass.h 
class MyFooClass : public CustomFoo< ClOldClass, ClNewClass > 
{ 
    public: 
     virtual std::auto_ptr<ClNewClass> show(ClOldClass &oc) 
     { 
      std::auto_ptr<ClNewClass> cnv(new ClNewClass(oc.params)); 
      return cnv; 
     } 
}; 

謝謝。

+0

該「班級轉換」的目的是什麼?什麼是'MyFooClass'實際上應該做的? – jogojapan

+0

這是一個適配器類。我有另一個使用ClOldClass的類,但我想將其更改爲ClNewClass。但是我不想讓其他類發送一個新類,而是仍然使用ClOldClass。但是,我的另一個班級正在使用ClNewClass。就像我正在改變我的另一個班級。 – domlao

+0

'MyFooClass'最終來自'IFoo',但它並未正確覆蓋它的'show'功能。該函數的返回類型必須是'std :: auto_ptr ',而不是'std :: auto_ptr '。你不能通過將另一個類放入類層次來改變這個事實,該類將正確的函數替換爲'protected',並引入一個新的類作爲'public'。 – jogojapan

回答

0

MyFooClass中的功能show(ClOldClass&)是與CustomFoo中的功能show(OtherClass&)不同的功能。新的定義隱藏了另一個。

你是否真的要超載在這裏而不是重寫?如果你打算重寫,你的新函數需要和父類有相同的簽名。如果確實意味着超載功能,則仍然需要其他show。將using CustomFoo::show;指令添加到您的課程MyFooClass

//MyFooClass.h 
class MyFooClass : public CustomFoo< ClOldClass, ClNewClass > 
{ 
    public: 
     virtual std::auto_ptr<ClNewClass> show(ClOldClass &oc) {...} 

    protected: 
     using CustomFoo::show; 
}; 
+1

*如果你打算重載,你的新功能應該有相同的簽名。如果你打算重寫,你仍然需要那個其他節目。*你的意思是說相反嗎?因爲您不能使用相同的簽名重載,但重寫需要相同的簽名。 –

+0

@JonasWielicki - 修正。謝謝。 –