将非纯虚函数转换为子类中的纯函数

时间:2013-05-16 10:30:02

标签: c++ polymorphism virtual

所以,我有这种多态的层次结构:

ClassA
Is not abstract, no pure virtual functions, but a few virtual functions

ClassB:public ClassA
Defines an extended interface for a certain type of subclass; 
 is abstract with pure virtual functions

ClassC:public ClassB
Usable class, no more subclassing

这是交易,我将ClassAClassC的对象一起放入容器并迭代完成。要执行此迭代,ClassA中存在非纯虚函数,但只有{}为空;也就是说,它是空的,仅当迭代遇到ClassC时才可用,在这种情况下它被调用,否则它什么也不做。我不能说它是纯粹的,否则我不能拥有ClassA的对象。

但是为了确保ClassC确实实现了该功能,迫使该类的用户这样做,我在ClassB中将此功能设为纯虚拟。

这可以接受吗?如果我采用非纯虚函数,使其纯净,然后在ClassC中再次使其变为纯净,那么什么都不会“破坏”?

2 个答案:

答案 0 :(得分:3)

如果按照您在解释中的说明实施,那就很好。没有涉及抽象基类和虚函数的整个部分,标准规定:

  

C ++§10.4p2

     

抽象类是一个只能用作其他类的基类的类;除了作为派生自它的类的子对象之外,不能创建抽象类的任何对象。如果一个类至少有一个纯虚函数,则它是抽象的。 [注意:这样的功能可能会被继承:见下文。 - 结束注释]通过在类定义中的函数声明中使用纯说明符(9.2)来指定虚函数。只有在使用(12.4)调用qualified-id语法(5.1)

时,才需要定义纯虚函数。

上面引用的“下面”引出了这个注释:

  

C ++11§10.4p5

     

[注意:抽象类可以从非抽象的类派生,纯虚函数可以覆盖不纯的虚函数。 - 结束记录]

答案 1 :(得分:0)

  

ClassA中存在非纯虚函数但未实现;

导致链接器错误。在创建ClassA或其子类的对象时,必须实现所有virtual方法。仅对于纯virtual方法,方法的主体是可选的。

  

但要确保ClassC确实实现了该功能,   强迫该类的用户这样做,我使这个功能纯净   virtual中的ClassB

是的,这种方式是正确的。但是,您还应该评估一下,是否值得拥有一个新类只是为了确保实现的方法很少? 对于C ++ 11,您可以考虑巧妙地使用override标识符。

此外,您不应该担心vtable的内部细节,因为它们是实现定义的。