一个类,它可能有基类,也可能存在多个基类,这些类里面还可能是虚拟基类,并且在类的本身也可能存在对象成员。那么所涉及的这些类或对象成员会以什么样的顺序来调用它们各自的构造函数呢?今天我们就来举例分析下。

执行以下程序:

#include <iostream>

using namespace std;

class Base{
public:
Base(){
cout << "The constructor of Base" << endl;
}
}; class VBase{
public:
VBase(){
cout << "The constructor of VBase" << endl;
}
}; class VBase_{
public:
VBase_(){
cout << "The constructor of VBase_" << endl;
}
}; /* 普通继承与虚继承 */
class A : public Base, virtual public VBase_, virtual public VBase{
public:
A(){
cout << "The constructor of A" << endl;
}
}; class B{
public:
B(){
cout << "The constructor of B" << endl;
}
}; class D{
public:
D(){
cout << "The constructor of D" << endl;
}
}; class C : public B, public A{
public:
C(){
cout << "The constructor of C" << endl;
} private:
/* 对象成员 */
D obj;
}; int main()
{
/* 实例化类 C */
C test = C(); return 0;
}

运行结果:

结论

C++多重继承的构造执行顺序:

1.首先执行虚基类的构造函数,多个虚基类的构造函数按照被继承的顺序构造;
2.执行基类的构造函数,多个基类的构造函数按照被继承的顺序构造;
3.执行成员对象的构造函数,多个成员对象的构造函数按照声明的顺序构造;
4.执行派生类自己的构造函数;
5.析构以与构造相反的顺序执行;

最新文章

  1. 热浪[TYVJ1031]
  2. PHP 模拟 HTTP 基本认证(Basic Authentication)
  3. Java bean validation 规范与参考实现
  4. MVC ViewBag和ViewData的区别
  5. 侃侃前端MVC设计模式
  6. MySQL优化—工欲善其事,必先利其器之EXPLAIN(转)
  7. MongoDB复制机制实例
  8. Android版的疯狂猜图游戏源码完整版分享
  9. js日期格式,日期对象
  10. 窗口过程 - Windows程序设计(SDK)006
  11. java多线程知识点概述
  12. python作业02
  13. arcis api for js 值 3.17 本地部署
  14. SSM-Spring-05:Spring的bean是单例还是多例,怎么改变?
  15. Docker 核心技术之数据管理
  16. mysql数据库备份并且实现远程复制
  17. MongoDB 入门篇
  18. 构建gulp项目
  19. 使用python处理百万条数据分享(适用于java新手)
  20. Ogre Compositor解析

热门文章

  1. lombok(@Getter&amp;@Setter)
  2. 14. The Realities of Telecommuting 远程办公的现状
  3. 做到让DBCP连接池不超时
  4. validatord的使用方法理解
  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十七之铭文升级版
  6. Windows平台下载Android源码(整理)
  7. 26、TCP服务器原理
  8. Nginx+Tomcat反向代理利用certbot实现https
  9. 696. Count Binary Substrings
  10. flask源码解析之上下文