所以,我有这种多态的层次结构:
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
这是交易,我将ClassA
和ClassC
的对象一起放入容器并迭代完成。要执行此迭代,ClassA
中存在非纯虚函数,但只有{}
为空;也就是说,它是空的,仅当迭代遇到ClassC
时才可用,在这种情况下它被调用,否则它什么也不做。我不能说它是纯粹的,否则我不能拥有ClassA
的对象。
但是为了确保ClassC
确实实现了该功能,迫使该类的用户这样做,我在ClassB
中将此功能设为纯虚拟。
这可以接受吗?如果我采用非纯虚函数,使其纯净,然后在ClassC
中再次使其变为纯净,那么什么都不会“破坏”?
答案 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
的内部细节,因为它们是实现定义的。