2

多くの派生クラスが存在する基本クラスがあります。ただし、プログラムのコンテナーに格納されているのは基本クラスへのポインターであるため、それらを反復して仮想関数を呼び出すことができます。

このコンテナーに基本クラス ポインターを追加する別のクラスがあるため、派生クラスが(ヌードnewではなく) edの場合、それらは基本クラス ポインターとして返されるか格納される必要があります。

テンプレートを使用して、これを行う単純な基本クラスの Factory メソッドを作成することを考えていました。

    template<class T> //T is the derived class
    static T* Factory(){
       return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T));
    }

主な長所と短所が 2 つあります。

利点: すべての派生クラスでこれをオーバーライドする必要はありません

T短所:私のベースから派生していないクラス型として渡すことにより、誤って使用される可能性があります。

Tこの関数内で派生していることを確認する方法はありますFactoryか? Tまたは、コンパイラが派生していないインスタンスをキャッチすることを期待できますか?

この一般的なアプローチは受け入れられるアイデアですか、それともより良い代替案はありますか?

4

2 に答える 2

2

T がこの関数 Factory 内で派生していることを確認する方法はありますか?

functionThatAddsBaseClassPointerToContainerがかかる場合、Base*それはすでに行われています。

Base* functionThatAddsBaseClassPointerToContainer(Base* b);  // <-- 

template<class T> //T is the derived class
static T* Factory(){
   // if T was not derived from Base, the following line fails to compile:
   return static_cast<T*>(functionThatAddsBaseClassPointerToContainer(new T));
}
于 2013-05-21T06:39:53.097 に答える