允许派生类从基本抽象类实现单个纯虚函数
Posted
技术标签:
【中文标题】允许派生类从基本抽象类实现单个纯虚函数【英文标题】:Allow derived class to implement a single pure virtual function from base abstract class 【发布时间】:2011-08-28 03:25:16 【问题描述】:是否有可能有一个带有许多纯虚函数的抽象基类:
template <typename T, typename U = NullType, typename V = NullType>
class Functor
public:
virtual ~Functor()
virtual T operator()() = 0;
virtual T operator()(U arg1) = 0;
virtual T operator()(U arg1, V arg2) = 0;
;
然后让派生类只实现这些功能之一?
例如
class Test : public Functor<void>
public:
void operator()()
std::cout << "Called Test::operator()" << std::endl;
;
我有一个基本的Functor
类的原因是我可以将函子存储在向量中。
【问题讨论】:
(假设“派生”在这里的意思是“最派生的,具体的”。)为什么会这样?纯虚函数的全部意义在于这是不允许的! 【参考方案1】:不,这是不可能的。如果您在Test*
上调用T operator()(U)
并且它没有实现它怎么办?您最终必须让一个类实现所有这些(或从一个或多个实现它们的类继承)来实例化它。
您可以保留任意数量的虚函数未定义,但如果您这样做,您的类将无法实例化,因为它仍然是抽象的。您必须让另一个类继承它并定义那些未定义的函数并实例化它。
tl;dr:要实例化一个类,在其类层次结构的某个地方,所有虚函数都必须有一个定义。
【讨论】:
我希望如果派生类只实现其中一个功能,那么其他功能将被视为该类未定义。 @Protosphere 不太好,因为您可以将Test<...>*
s 作为Functor<T>*
s 传递。因此,您无法分辨它是什么类型,并且编译器无法在编译时跟踪您的类,并确保您不会在尚未定义的类实例上调用未定义的虚拟方法。所以你必须实现所有这些。
所以我想实现我想要的行为的唯一方法是拥有单独的基类,例如 Functor0、Functor1、Functor2 等,它们声明一个带有一定数量参数的 operator()。
@Proto 是的,没错。然后你知道当你接受它作为参数时你的 Functor 接受了多少参数。一种可能性是声明 template<unsigned int NumArgs> class Functor;
并为 1、2、3、4、5 等参数编写特化,然后让它们将各自的参数数量传递给 operator()
。
@Proto like this,或者你总是可以通过模板类型参数的数量来推断参数的数量like this【参考方案2】:
是的,这是可能的。但是派生类仍然是抽象的。
【讨论】:
【参考方案3】:是的,这是可能的。但是,这意味着派生类本身仍然是抽象的,无法实例化,您需要从它进一步派生,直到您定义了所有虚函数。
【讨论】:
以上是关于允许派生类从基本抽象类实现单个纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章