首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多重继承的构造函数会被多次调用吗?

多重继承的构造函数会被多次调用吗?
EN

Stack Overflow用户
提问于 2011-09-13 17:17:46
回答 3查看 11.2K关注 0票数 20

多重继承的构造函数会被多次调用吗?构造函数是按什么顺序调用的?这取决于继承列表中的顺序吗?

这里有一个例子(这只是为了让情况变得清晰,没有实际的例子)。

代码语言:javascript
运行
AI代码解释
复制
class Base {};
class DerivedBaseOne : public Base {};
class DerivedBaseTwo : public Base {};
class Derived : public DerivedBaseTwo, public DerivedBaseOne 
{};

//somewhere in the code, is Base() called two times here?
Derived * foo = new Derived();

Base()构造函数是否被调用了两次?构造函数是按什么顺序调用的呢?首先是基地?还是先用DerivedBaseOne()DerivedBaseTwo()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-13 17:21:58

按照您编写的方式,Derived有两个不同于的Base类型的子对象,每个子对象都从各自的DerivedBaseXXX构造函数中调用它们自己的构造函数,它是DerivedBaseXXX的子对象。调用的顺序遵循声明的顺序。

相反,如果声明DerivedBaseXXX : virtual public Base,那么只有一个 Base子对象,并且它的构造函数是从派生最多的对象中调用的,即从Derived对象中调用。

(更详细地解释:一个(可能是单继承的)类是通过首先1)调用基类的构造函数,然后2)按声明的顺序调用所有成员对象的构造函数,最后3)执行构造函数主体来构造的。这是递归应用的,对于多重继承,您只需按照声明继承的顺序调用基类的所有构造函数来替换(1)。只有虚拟继承才会在这里增加一层真正的额外复杂性。)

票数 14
EN

Stack Overflow用户

发布于 2011-09-13 17:20:16

继承层次结构的构造函数调用顺序为:

代码语言:javascript
运行
AI代码解释
复制
Base()  
DerivedBaseTwo()  
Base()
DerivedBaseOne()  
Derived()

顺序确实是定义良好的,并且取决于您提到基类的派生的顺序以及在类中为成员声明成员的顺序。(请参阅下面的C++标准中的参考。)

是否会调用Base()构造函数两次?

是的

Base()类构造函数在这里被调用了两次,因为有两个类DerivedBaseTwo()DerivedBaseOne()派生自它,所以基类构造函数被调用一次。您的Derived类有两个不同的Base子对象,它们通过多个路径(一个通过DerivedBaseOne(),另一个通过DerivedBaseTwo())。

具有多重继承的类的层次结构是不寻常的,这会导致一个称为的问题。为了避免这个问题,C++引入了的概念。

参考资料:

C++03标准: 12.6.2/5,初始化库和成员

初始化应按以下顺序进行:

-首先,并且仅对于下面描述的最多派生类的构造函数,虚拟基类应该按照它们在基类的有向无循环图的深度优先从左向右遍历时出现的顺序进行初始化,其中“从左到右”是基类名称在派生类基说明符列表中的出现顺序。

-然后,直接基类应该按照它们在base-specifier-list中出现的声明顺序进行初始化(不管mem-initializers的顺序如何)。

-然后,应该按照类定义中声明的顺序对非静态数据成员进行初始化(同样,不管mem-initializers的顺序如何)。

-最后,执行构造函数的主体。

票数 20
EN

Stack Overflow用户

发布于 2011-09-13 17:21:58

答案是:http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.14

要执行的第一个构造函数是层次结构中任何位置的虚拟基类。它们按照它们在基类图形的深度优先从左向右遍历中出现的顺序执行,其中从左到右是指基类名称的出现顺序。

因为您的多重继承声明首先列出了DerivedBaseTwo,所以它的构造顺序将在DerivedBaseOne之前执行。

因此,在您的Derived类中,首先创建DerivedBaseTwo及其链,即:

1- Base,然后是DerivedBaseTwo

然后是DerivedBaseOne和它的链:

2- Base,然后是DerivedBaseOne

然后:

3- Derived是在创建其他所有内容之后创建的。

此外,对于多重继承,请注意Diamond Inheritance Problem

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

https://stackoverflow.com/questions/7405839

复制
相关文章
【玩转腾讯云】无需任何基础使用云开发部署静态WordPress
相信很多同学都接触过或者使用过博客系统WordPress,WordPress不得不说是一个非常棒的一个CMS,这点是毋庸置疑的,不管是从它的性能上来说还是从它整个的一个功能上。那么本篇文章,就教你如何把一个静态的WP部署到腾讯云的云开发上。
Doggy
2020/04/01
2.8K3
【玩转腾讯云】无需任何基础使用云开发部署静态WordPress
无需任何插件,WordPress 已经内置了 sitemap 功能
对于任何网站来说,向搜索引擎提交 sitemap 都是能够快速提高网站收录的最好的方法。之前很多人问我是用什么插件生成 sitemap 文件,其实 WordPress 已经内置了 sitemap 功能,无需安装任何插件。
Denis
2023/04/13
1.6K0
无需任何插件,WordPress 已经内置了 sitemap 功能
WordPress 静态化部署到云开发网站托管
相信很多同学都接触过或者使用过博客系统WordPress,WordPress不得不说是一个非常棒的一个CMS,这点是毋庸置疑的,不管是从它的性能上来说还是从它整个的一个功能上。那么本篇文章,就教你如何把一个静态的WP部署到腾讯云的云开发上。
腾讯云开发TCB
2020/07/30
4.9K1
WordPress 静态化部署到云开发网站托管
wordpress使用插件实现文章摘要显示
刚才发了一篇文章,以前博客上的。发现在首页把文章都显示出来了,这个可就不太美观了,也不利于读者阅读。
the5fire
2019/02/28
1.1K0
WordPress文章置顶插件Classic Posts 使用详解
我们知道,WordPress的日志是按时间排序的,新的文章总在旧的文章之上。而当日志的文章多了,而你又想把一些自己认为值得访客浏览和注意的文章放在最顶部,就象在论坛内看到的置顶帖子一样。你可以选择使用Classic Posts这个插件。
星哥玩云
2022/06/11
7200
WordPress 插件下载管理插件:WordPress Plugin Download
你插件者吗,你是否把你插件上传到了 WordPress 了吗?了解下这个插件吧!翻译自:Weblog Tools Collection 的 APAD: WordPress Plugin Download
Denis
2023/04/13
9160
WordPress上传图片静态文件同步腾讯云COS对象云存储插件
WordPress,作为全球用户量最大的免费CMS程序,小到个人博客、大到企业网站、电子商务网站都可以使用。WordPress虽然也有各种优势,但是也有不小的缺点,比如服务器带宽不足、配置不高,静态资源存放在本地服务器中打开速度会比较慢,尤其是文章中图片比较多、比较大图片,当然还包括其他上传的静态文件。
Alexaer
2019/03/15
7.9K0
【玩转腾讯云】云开发部署VuePress静态博客
通过 node -v 命令查看本机是否安装,如果没有安装,参考node.js安装指南 根据电脑系统环境进行安装
王秀龙
2020/03/30
2.4K0
【玩转腾讯云】云开发部署VuePress静态博客
WordPress 技巧:无需输入 FTP 信息就能升级 WordPress 及插件
你是否碰到这样的情况:当添加,删除,升级 WordPress 插件或者直接升级 WordPress 的时候,WordPress 总是提示让你输入 FTP 帐号信息,非些烦人。
Denis
2023/04/15
4180
无需插件只使用浏览器下载b站视频
========================以下为博客原文========================
全栈程序员站长
2022/09/14
1.6K0
我开发的 WordPress 插件
使用 WordPress 一段时间,应该算是满久了,总有一些奇奇怪怪的想法,所以也整了一些奇奇怪怪的插件,今天把他们整理下给大家汇聚分享下。欢迎大家选用, 🙂 。 Top Friends 这是一个 WordPress BlogRoll 加强插件,它能够通过不同图标显示 Feed 更新时间,以及最新更新的两篇日志。 WordPress 用户体验插件 你的博客流量和订阅用户不多,那么就加强下你博客的用户体验吧。 WordPress Planet 想创建和 WordPress 火星一样的页面,那么它就
Denis
2023/04/13
3790
静态网站在腾讯云上的托管
云加创业小助手
2016/11/01
12.7K0
静态网站在腾讯云上的托管
无需插件!轻松整合WordPress与CDN加速服务
在 WordPress 主题目录下的 functions.php 文件中,加入以下代码实现替换功能:
空木白博客
2019/09/04
2.9K0
Typecho文章静态化缓存插件 TpHtmlCache
插件简介 激活插件后所有文章会在本地以静态页的方式被缓存掉 已测试可用typecho版本 1.1 (17.10.30)
用户7146828
2021/08/09
1.2K0
WordPress加速技巧总结-如何使您的WordPress网站加载速度快
网站优化网站加速一直是一个持久的话题,及时今天我们的网络宽带速度越来越好了,但是对于速度的追求是无止境的,文章来源:https://zouaw.com/
wordpress建站吧
2019/09/27
1.2K0
WordPress加速技巧总结-如何使您的WordPress网站加载速度快
云服务平台Gospel:无需任何代码,即可开发APP和网站应用程序
Gospel是一个集网站、部署、App在线开发、运维一站式云服务为一体的平台。Gospel集成编程环境服务,提供安全的代码云存储、云编译、云部署功能。 技术层面上,Gospel前端是基于先进的HTML
BestSDK
2018/02/28
1.4K0
云服务平台Gospel:无需任何代码,即可开发APP和网站应用程序
我的Serverless实战—基于Serverless搭建WordPress个人博客图文教程
serverless中的server是服务器的意思,less是没有的意思,顾名思义也就是无服务器
炒香菇的书呆子
2021/05/06
1.8K0
如何在云开发静态托管中部署Docsify
云开发:云开发(CloudBase)是一款云端一体化的产品方案 ,采用 serverless 架构,免环境搭建等运维事务 ,支持一云多端,助力快速构建小程序、Web应用、移动应用。
腾讯云开发TCB
2020/04/13
1.6K0
【玩转腾讯云】基于serverless搭建wordpress详细教程及配置体验
serverless中的server是服务器的意思,less是没有的意思,顾名思义也就是无服务器
炒香菇的书呆子
2021/05/03
11.9K12
最佳 WordPress 静态缓存插件 WP Super Cache 安装和使用
WP Super Cache 是 WordPress 官方开发人员 Donncha 开发,是当前最高效也是最灵活的 WordPress 静态缓存插件。它把整个网页直接生成 HTML 文件,这样 Web 服务器就不用解析 PHP 脚本,通过使用这个插件,能使得你的 WordPress 博客将显著的提速。
Denis
2023/04/14
1.3K0
最佳 WordPress 静态缓存插件 WP Super Cache 安装和使用

相似问题

将 Hexo 部署到云开发静态托管中为什么出问题?

1119

腾讯云插件哪里下载?

0214

基础库版本太高,云开发中的数据无法返回?

0130

web云开发,静态页面开发如何提高开发效率?

1346

小程序云开发插件添加腾讯视频云?

0370
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档