允许派生类从基本抽象类实现单个纯虚函数

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&lt;...&gt;*s 作为Functor&lt;T&gt;*s 传递。因此,您无法分辨它是什么类型,并且编译器无法在编译时跟踪您的类,并确保您不会在尚未定义的类实例上调用未定义的虚拟方法。所以你必须实现所有这些。 所以我想实现我想要的行为的唯一方法是拥有单独的基类,例如 Functor0、Functor1、Functor2 等,它们声明一个带有一定数量参数的 operator()。 @Proto 是的,没错。然后你知道当你接受它作为参数时你的 Functor 接受了多少参数。一种可能性是声明 template&lt;unsigned int NumArgs&gt; class Functor; 并为 1、2、3、4、5 等参数编写特化,然后让它们将各自的参数数量传递给 operator() @Proto like this,或者你总是可以通过模板类型参数的数量来推断参数的数量like this【参考方案2】:

是的,这是可能的。但是派生类仍然是抽象的。

【讨论】:

【参考方案3】:

是的,这是可能的。但是,这意味着派生类本身仍然是抽象的,无法实例化,您需要从它进一步派生,直到您定义了所有虚函数。

【讨论】:

以上是关于允许派生类从基本抽象类实现单个纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章

抽象类 纯虚函数

抽象类

抽象类中的纯虚函数,返回类型为基/派生类型

纯虚函数和抽象类

抽象类

抽象类