オブジェクト型の種類に応じて異なる種類のファンクタの呼び出しを呼び出すプログラムでパターンを使用しています。以下のコードでは、b1
オブジェクトは、派生ファンクタタイプFunctorX
で明示的にインスタンス化されています。しかし、コード内で呼び出しを行うと、派生ファンクタの代わりに基本ファンクタが呼び出されます。何故ですか?派生ファンクタがテンプレートパラメータとして渡されたときに呼び出されない
struct Functor
{
Functor() {}
~Functor() {}
virtual int operator()() { return 33; }
};
struct FunctorX : public Functor
{
FunctorX() : Functor() {}
~FunctorX() {}
int operator()() { return 44; }
};
template< typename FunctorT >
struct B
{
B(FunctorT FunctorArg) : Functor { FunctorArg } {}
~B() {}
FunctorT Functor;
};
int main()
{
B<Functor> b1 { FunctorX() }; // initialize with derived functor. Derived functor gets instantiated.
int num = b1.Functor(); // error: calls base functor, not derived functor
return 0;
}
@ BarryはBのメンバファンクタをptrに変更すると、B < Functor > b1 {new FunctorX()}; 'を実行してスライスを修正します。しかし、それでは、「b1」の呼び出しはどうなるでしょうか? 'エラーC2064:' b1.Functor(); 'を呼び出すと、termは0引数を取る関数に評価されません。 – rtischer8277
@Barry私はそれを持っています: 'int num =(* b1.Functor)();' – rtischer8277