所以,我有这个多态的层次结构:
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
中再次使其成为非纯函数,那么什么都不会“中断”?
发布于 2013-05-16 19:02:02
如果按照您在解释中提出的方式实现,您就很好了。在不涉及抽象基类和虚函数的整个部分的情况下,该标准规定:
C++§10.4p2
抽象类是只能用作其他类的基类的类;除非作为从抽象类派生的类的子对象,否则不能创建抽象类的任何对象。如果一个类至少有一个纯虚函数,那么它就是抽象的。注意:这样的函数可能是继承的:见下文。- end注释通过在类定义的函数声明中使用纯说明符(9.2)来指定虚函数。仅当使用或好像使用(12.4)限定id语法(5.1)调用时,才需要定义纯虚函数
上面提到的“下面”引出了这个注释:
C++11§10.4p5
注意:抽象类可以从非抽象类派生,纯虚函数可以覆盖非纯虚函数。-结束注释
发布于 2013-05-16 19:04:51
ClassA
中存在非纯虚函数
,但尚未实现;
这会导致链接器错误。在创建ClassA
或其子类的对象时,必须实现所有virtual
方法。只有纯virtual
方法的方法体是可选的。
但为了确保
ClassC
确实实现了该函数,迫使该类的用户这样做,我在ClassB
中将该函数设为纯virtual
。
是的,这条路是对的。但是,您也应该评估一下,仅仅为了确保实现了很少的方法而创建一个新类是否值得?
对于C++11,您也可以考虑巧妙地使用override
标识符。
此外,您不必担心vtable
的内部细节,因为它们是由实现定义的。
https://stackoverflow.com/questions/16585033
复制相似问题