2013-10-29 99 views
1

什麼是具有這樣的一類最巧妙的方法,自動協變類派生

class Object 
{ 
public: 
    virtual Object* Find(string name); 
}; 

實施,使得其派生類Find()方法自動返回派生類類型,而無需做這樣的事情:

class DerivedObject : public Object 
{ 
public: 
    DerivedObject* Find(string name); 
}; 

手動?

附加:實際上在我真正的實現它是一堆static功能,而不是virtual的。我有static Object* Object::Find(string name)static GameObject* GameObject::Find(string name)等功能。

+1

我相信你運氣不好 – texasbruce

+0

嗯...甚至不通過模板,不知何故? –

+0

使Find'虛擬的全部意義在於你可以引用'Object'來調用'Find'。但這一定意味着你會期待'Find'返回一個'Object',而不是'DerivedObject'。 – Adam

回答

2

擺脫virtual函數,而是寫一個免費的函數。

template<typename T> 
T* Find(T& object, string name) { 
} 

你必須通過Find(derivedobject,name),而不是derivedobject.Find(name)稱呼它,但除此之外,我認爲這將表現爲你喜歡。

如果您需要它可以訪問protected數據,您還必須在Object之內聲明此爲friend。只需在Object類中放入以下行。

template<typename T> 
friend 
T* Find(T& object, string);