我在我的程序中使用了一个模式,它根据对象类型的要求调用不同类型的仿函数。在下面的代码中,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;
}
答案 0 :(得分:0)
B<Functor>
包含Functor
类型的对象。您可以使用类型为FunctorX
的对象初始化该对象,但在存储时,对象将被切片为Functor
类型。就像unsigned int i = std::numeric_limits<unsigned long long>::max()
一样,存储的值的类型为unsigned int
,即使它使用类型为unsigned long long
的值进行初始化。