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)ます。

4

1 に答える 1

2

関数を取り除き、virtual代わりに自由な関数を書きます。

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

Find(derivedobject,name)の代わりに経由で呼び出す必要がありますがderivedobject.Find(name)、そうでなければ、これは好きなように動作すると思います。

データにアクセスする必要がある場合は、これをfriend内部として宣言する必要もあります。クラス内に次の行を挿入するだけです。ObjectprotectedObject

template<typename T>
friend
T* Find(T& object, string);
于 2013-10-30T00:39:16.580 に答える