菱形继承中构造函数调用问题

在某一个虚基类的任何一个派生类的构造函数中,都要将该虚基类的构造函数显示列出来。
包含虚基类的派生类对象的构造函数的调用顺序如下:

  1. 虚基类的构造函数在非虚基类之前调用。
  2. 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的顺序调用。
  3. 若虚基类由非虚基类派生而来,则仍然按照先调用基类的构造函数,再调用派生类的构造函数的执行顺序。
#include <iostream>  using namespace std;  class base{  int x;
public:  base(int i){  cout<<(x = i)<<endl;  }
};  class A1 : virtual base{
public:  A1(int i):base(i){}
};  class A2 : virtual base{
public:  A2(int i):base(i){}
};  class C: public A1,public A2{
public:  C(int i):A1(i+1),A2(i+2){}
};  int main(){  C c(1);
}

程序报错:找不到base类的默认构造函数
说明:
在类C实例化要调用base的构造函数,因为没有显示给出,所以编译器试图调用base的默认构造函数,但是程序没有提供,所以报错。
当采用虚继承时,最终派生类对象中只有一个虚基类的对象,因此该虚基类的对象只要构造一次即可(由此支持多继承)。而且该构造函数是在最终的派生类构造函数中调用的,中间派生类不调用虚基类的构造函数。
在本例中,要定义C类的对象c,C类的构造函数直接调用base类的构造函数,来构造唯一的对象,虽然该对象也属于c中A1,A2的无名对象,但是A1,A2的构造函数列表中对base构造函数的调用被忽略。
改正方法:
将类C的构造函数改成C(int i):base(i),A1(i+1),A2(i+2){}或者给base类添加默认构造函数都可。
可以看出在A1,A2中对类base的构造函数都没有调用,当然如果直接定义A1或A2的对象,则类base的构造函数要被调用。1


  1. 原文章地址https://codepeak.iteye.com/blog/766489 ↩︎

菱形继承中构造函数调用问题相关推荐

  1. C++继承中构造和析构顺序

    C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...

  2. 继承构造函数调用顺序_C ++中带有继承的构造函数调用的顺序

    继承构造函数调用顺序 Base class constructors are always called in the derived class constructors. Whenever you ...

  3. C++中构造函数调用构造函数

    #include <stdlib.h> #include <iostream> using namespace std;struct CLS {int m_i;CLS( int ...

  4. 从一道题谈C++中构造函数调用构造函数

    转载:http://www.cnblogs.com/chio/archive/2007/10/20/931043.html 题目如下:问下列代码的打印结果为0吗? #include <stdli ...

  5. 继承中构造和析构顺序

    1.子类继承父类后,当创建子类对象,也会调用父类的构造函数 2.继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 #include<iostream> using name ...

  6. C++虚继承(九) --- 构造函数调用顺序的实用之处

    虚拟继承是C++语言中一个非常重要但是又比较生僻的存在,它的定义非常简单,但是对于理解C++的继承机制却是非常有用的.笔者最近学习过程中发现对C++的虚拟继承不是很明朗,故在这里对虚继承做个小结. 首 ...

  7. C++继承中构造顺序

    原文地址:https://www.cnblogs.com/lawlietfans/p/5861769.html 规范的派生类构造函数有3个要点: 1.首先创建基类对象. 2.应通过成员初始化列表,创建 ...

  8. c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)

    目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理 ...

  9. c++继承中的构造和析构

    c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...

最新文章

  1. Dynamips和Vmware完成CCVP试验(4)
  2. [云炬创业管理笔记]第三章打造优秀创业团队讨论1
  3. Windows操作系统,启动Tomcat之后DOS窗口乱码处理
  4. 设计导航-超全智能的设计师导航网站
  5. CN笔记:第三章 链路层
  6. 病毒传播数学建模matlab分析,数学建模MATLAB之分析法(一)
  7. css中文本超出部分省略号代替
  8. 使用Python进行差分进化全局优化
  9. 【PC】TP-LINK WDN5200 AP模式无网络连接权限解决
  10. 谷歌浏览器如何设置兼容
  11. 计算机主机接电视机,电脑主机连接电视方法介绍 电脑主机连接电视注意事项...
  12. 9.23 深度学习微调
  13. Linux 中断(IRQ/softirq)基础:原理及内核实现
  14. 高逼格的console.log(),要不来看下
  15. andorid xmlns:tools=“http://schemas.android.com/tools“是用来做什么的?
  16. 阿里云公共DNS安全传输服务介绍(DoH/DoT)
  17. 花了一个周末折腾蜗牛星际的黑群晖,多图预警!
  18. 2020第四届全球程序员节观后感
  19. 阿里云服务器选购指南(图文教程详解)
  20. mxnitro浏览器 v1.0.0.500 官方版

热门文章

  1. 使用spring boot+kubernetes构建完整微服务平台
  2. == 和 === 有什么区别?
  3. 什么是IOC(控制反转)、DI(依赖注入)
  4. 腾讯云网站备案-网站访问类问题汇总及解答
  5. Python pandas库|任凭弱水三千,我只取一瓢饮(2)
  6. html中文本旋转90度,css如何使文字方向转90度
  7. 【this,super关键字使用】经典习题
  8. 怎么分割视频,一个视频如何剪切成多个
  9. 微信的挑战者来了,你知道吗?
  10. Ebox 的OS定制