首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载虚拟方法与非虚拟方法有何不同?

重载虚拟方法与非虚拟方法有何不同?
EN

Stack Overflow用户
提问于 2012-03-18 07:07:52
回答 3查看 8.9K关注 0票数 7

这两者之间有什么区别:

  • 声明基类函数为虚,并更改派生类函数。
  • 重载继承的非虚拟函数。

你什么时候会用一种而另一种?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-18 07:15:24

当将基类方法声明为virtual时,为了覆盖它,需要在派生类中提供一个具有完全相同签名的函数(允许协变返回类型)。

如果您的函数名相同,但派生类中的签名与基类中的签名不同,而不再是超限签名,则它是函数隐藏,派生类方法隐藏基类方法。

函数重载永远不是交叉类,您可以在同一个类中重载方法,也可以重载函数,但不能重载类。当您尝试这样做,跨越类,您最终得到的是函数隐藏。

若要将基类方法引入派生类的作用域中,需要添加

派生类的附加using functionName

编辑:

至于何时使用virtual过载的问题,答案是:

如果您打算为运行时多态性重写类的函数,则应该将它们标记为virtual,而不是如果您不打算这样做。

读得好:

何时将C++中的函数标记为虚拟函数?

票数 6
EN

Stack Overflow用户

发布于 2012-03-18 07:31:20

重载完全独立于(正交)虚拟覆盖。

在重写过程中,一个函数被替换为另一个相同签名的函数。然后有一些规则来选择“最重写”函数,对于虚拟函数来说,这意味着在派生最多的类中定义的函数。作为虚拟函数的特例,签名的返回类型可能略有不同(协方差)。

在重载中,具有不同参数类型的函数签名同时充当在进行函数调用时要选择的候选项。有一套非常复杂的规则来选择正确的规则,这在95%的时间里都很有效,当它不合作的时候会让你头疼。

由于重载具有不同的签名,而重写的工作具有相同的签名,因此它们并不真正相互干扰。

可以将基类的函数显式导入派生类,以扩展重载的函数名。这是由using base_class::overload_name;在派生类中完成的。

票数 3
EN

Stack Overflow用户

发布于 2012-03-18 07:52:21

我相信你的意思是覆盖非虚拟函数而不是重载。当您覆盖派生类中的非虚拟基类函数时,对该函数的调用将在编译时被解析和绑定。这意味着基于调用函数的类型(或指针)解析函数调用。如果要调用基类指针上的函数,则始终调用基类版本。如果使用派生类指针,则始终调用派生版本;而不考虑它所指向的实际对象。

如果基类版本被标记为虚拟版本,则将调用解析或绑定推迟到在运行时根据进行调用的对象的类型而不是基于用于调用的指针的类型进行。这意味着您可以使用基类指针指向基类和派生类对象,然后调用该函数。根据指针指向的对象类型,调用相应的函数版本。这意味着,如果我的指针指向基类对象,则调用基类版本。如果指针指向派生类型对象,则调用派生verion。

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

https://stackoverflow.com/questions/9756646

复制
相关文章

相似问题

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