首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在子类中将非纯虚函数转换为纯虚函数

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

Stack Overflow用户
提问于 2013-05-16 18:30:02
回答 2查看 932关注 0票数 6

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

代码语言:javascript
运行
复制
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中再次使其成为非纯函数,那么什么都不会“中断”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 19:02:02

如果按照您在解释中提出的方式实现,您就很好了。在不涉及抽象基类和虚函数的整个部分的情况下,该标准规定:

C++§10.4p2

抽象类是只能用作其他类的基类的类;除非作为从抽象类派生的类的子对象,否则不能创建抽象类的任何对象。如果一个类至少有一个纯虚函数,那么它就是抽象的。注意:这样的函数可能是继承的:见下文。- end注释通过在类定义的函数声明中使用纯说明符(9.2)来指定虚函数。仅当使用或好像使用(12.4)限定id语法(5.1)调用时,才需要定义纯虚函数

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

C++11§10.4p5

注意:抽象类可以从非抽象类派生,纯虚函数可以覆盖非纯虚函数。-结束注释

票数 5
EN

Stack Overflow用户

发布于 2013-05-16 19:04:51

ClassA中存在非纯虚函数

,但尚未实现;

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

但为了确保ClassC确实实现了该函数,迫使该类的用户这样做,我在ClassB中将该函数设为纯virtual

是的,这条路是对的。但是,您也应该评估一下,仅仅为了确保实现了很少的方法而创建一个新类是否值得?

对于C++11,您也可以考虑巧妙地使用override标识符。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16585033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档