菱形继承中构造函数调用问题
菱形继承中构造函数调用问题
在某一个虚基类的任何一个派生类的构造函数中,都要将该虚基类的构造函数显示列出来。
包含虚基类的派生类对象的构造函数的调用顺序如下:
- 虚基类的构造函数在非虚基类之前调用。
- 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的顺序调用。
- 若虚基类由非虚基类派生而来,则仍然按照先调用基类的构造函数,再调用派生类的构造函数的执行顺序。
#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
原文章地址https://codepeak.iteye.com/blog/766489 ↩︎
菱形继承中构造函数调用问题相关推荐
- C++继承中构造和析构顺序
C++继承中构造和析构顺序 继承中构造和析构顺序 问题:父类和子类的构造和析构顺序是谁先谁后? 示例 继承中构造和析构顺序 子类继承父类后,当创建子类对象,也会调用父类的构造函数 问题:父类和子类的构 ...
- 继承构造函数调用顺序_C ++中带有继承的构造函数调用的顺序
继承构造函数调用顺序 Base class constructors are always called in the derived class constructors. Whenever you ...
- C++中构造函数调用构造函数
#include <stdlib.h> #include <iostream> using namespace std;struct CLS {int m_i;CLS( int ...
- 从一道题谈C++中构造函数调用构造函数
转载:http://www.cnblogs.com/chio/archive/2007/10/20/931043.html 题目如下:问下列代码的打印结果为0吗? #include <stdli ...
- 继承中构造和析构顺序
1.子类继承父类后,当创建子类对象,也会调用父类的构造函数 2.继承中先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反 #include<iostream> using name ...
- C++虚继承(九) --- 构造函数调用顺序的实用之处
虚拟继承是C++语言中一个非常重要但是又比较生僻的存在,它的定义非常简单,但是对于理解C++的继承机制却是非常有用的.笔者最近学习过程中发现对C++的虚拟继承不是很明朗,故在这里对虚继承做个小结. 首 ...
- C++继承中构造顺序
原文地址:https://www.cnblogs.com/lawlietfans/p/5861769.html 规范的派生类构造函数有3个要点: 1.首先创建基类对象. 2.应通过成员初始化列表,创建 ...
- 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 继承同名静态成员处理 ...
- c++继承中的构造和析构
c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...
最新文章
- Dynamips和Vmware完成CCVP试验(4)
- [云炬创业管理笔记]第三章打造优秀创业团队讨论1
- Windows操作系统,启动Tomcat之后DOS窗口乱码处理
- 设计导航-超全智能的设计师导航网站
- CN笔记:第三章 链路层
- 病毒传播数学建模matlab分析,数学建模MATLAB之分析法(一)
- css中文本超出部分省略号代替
- 使用Python进行差分进化全局优化
- 【PC】TP-LINK WDN5200 AP模式无网络连接权限解决
- 谷歌浏览器如何设置兼容
- 计算机主机接电视机,电脑主机连接电视方法介绍 电脑主机连接电视注意事项...
- 9.23 深度学习微调
- Linux 中断(IRQ/softirq)基础:原理及内核实现
- 高逼格的console.log(),要不来看下
- andorid xmlns:tools=“http://schemas.android.com/tools“是用来做什么的?
- 阿里云公共DNS安全传输服务介绍(DoH/DoT)
- 花了一个周末折腾蜗牛星际的黑群晖,多图预警!
- 2020第四届全球程序员节观后感
- 阿里云服务器选购指南(图文教程详解)
- mxnitro浏览器 v1.0.0.500 官方版