C++继承中构造函数调用顺序
来源:互联网 发布:linux 网桥配置 编辑:程序博客网 时间:2024/06/05 03:06
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
简单单继承
class Y {...}
class X : public Y {...}
X one;
构造函数的调用顺序是下面的顺序:
Y(); // 基类的构造函数
X(); // 继承类的构造函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
对于多基类的情况,下面是一个例子:
class X : public Y, public Z
X one;
构造函数以声明的次序调用。
Y(); // 基类构造函数首先被调用
Z();
X();
基类构造函数如果有多个基类则构造函数的调用顺序是某类在类派生表中出现的
顺序而不是它们在成员初始化表中的顺序
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
派生类存在虚基类时:
虚基类的构造函数在任何非虚基类构造函数前调用。
如果构造中包括多个虚基类,它们的调用顺序以声明顺序为准。
如果虚类是由非虚类派生而来,那非虚类的构造函数要先被调用。下面是一个例子:
class X : public Y, virtual public Z
X one;
调用顺序如下:
Z(); // 虚基类初始化
Y(); // 非虚基类
X(); // 继承类
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
下面是一个复杂的例子:
如果类继承中包括多个虚基类的实例,基类只被初始化一次。
class base;
class base2;
class level1 : public base2, virtual public base;
class level2 : public base2, virtual public base;
class toplevel : public level1, virtual public level2;
toplevel view;
构造函数调用顺序如下:
base(); // 虚基类仅被构造一次
base2();
level2(); // 虚基类
base2();
level1();
toplevel();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
存在成员类的情况
class X;
class Y
{
...
class X;
...
}
Y one;
调用顺序如下:
X(); // 成员类
Y();
如果类里面有成员类,成员类的构造函数优先被调用;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
存在成员类与基类
class Q;
class Z
class Y;
class X: public Z
{
...
class Y;
class Q;
...
}
Y one;
调用顺序如下:
Z(); // 成员类
Y();
Q();
X();
创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);
成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中
被声明的顺序而不是它们出现在成员初始化表中的顺序(这里我也有一点混乱)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
派生类构造函数
作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递
给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于
正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
应该是相当详细了,能遇到的大部分应该已经涵盖了,其他情况也可以类推。
希望能查漏不缺,给大家一些帮助!!
- C++继承中构造函数调用顺序
- C++继承关系中构造函数的调用顺序
- java关于继承中构造函数的调用顺序
- C++中多重继承构造函数调用的先后顺序
- Java中继承关系的构造函数的调用顺序
- C++继承构造函数调用顺序问题
- C++多继承构造函数调用顺序
- 继承中的构造函数调用顺序
- 继承中的构造函数调用顺序
- java继承的构造函数调用顺序
- 【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序
- 继承中构造器调用顺序
- 看C++中构造函数的调用顺序
- C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定
- C++继承中构造函数、析构函数调用顺序及虚析构函数
- 继承中构造函数和析构函数地调用顺序
- 继承中构造函数和析构函数地调用顺序
- 继承中构造函数和析构函数地调用顺序
- C/C++时间函数使用方法
- 问题四十八: 2011年11月02日是一个回文日:2011 1102,我还记得我和2011级的同学在这一天一起做这个题的时候!请列出近80还有多少个回文日
- 最全的Android源码目录结构详解
- 第四次上级作业
- 服务器中判断客户端socket断开连接的方法
- C++继承中构造函数调用顺序
- spring整合struts2方案(二)
- [转]fedora9安装gcc3.4
- 恒生电子的坑爹Java笔试题
- 97 things every programmer should know
- 递归——杭电1143
- 基于MFC的gda环境搭建
- 基类构造中,不要期望多态行为
- 显卡温度过高怎么办,解决显卡温度过高办法?