c++ 类的构造顺序
在单继承的情况下,父类构造先于子类,子类析构先于父类,例:
class A {
public:
A() {
cout << "A" << endl;
}
~A() {
cout << "~A" << endl;
}
};
class B : public A {
public:
B() {
cout << "B" << endl;
}
~B() {
cout << "~B" << endl;
}
};
结果为:
A
B
~B
~A
在多继承的情况下,此时的构造顺序在满足单继承构造顺序要求的情况下,出现了两个同级父类的构造顺序问题。在这个时候,对于同级父类,构造顺序是根据继承列表从左往右的。析构顺序相反。
class A {
public:
A() {
cout << "A" << endl;
}
~A() {
cout << "~A" << endl;
}
};
class B{
public:
B() {
cout << "B" << endl;
}
~B() {
cout << "~B" << endl;
}
};
class C : public B, public A {
public:
C() {
cout << "C" << endl;
}
~C() {
cout << "~C" << endl;
}
};
输出:
B
A
C
~C
~A
~B
类中包含类对象的情况下的构造顺序:
class A {
public:
A() {
cout << "A" << endl;
}
~A() {
cout << "~A" << endl;
}
};
class B : public A {
public:
B() {
cout << "B" << endl;
}
~B() {
cout << "~B" << endl;
}
};
class C : public B, public A {
public:
C() {
cout << "C" << endl;
}
~C() {
cout << "~C" << endl;
}
};
class D : public B {
public:
D() {
cout << "D" << endl;
}
~D() {
cout << "~D" << endl;
}
private:
C c;
A a;
};
输出结果为:
A // D 继承 B,B 继承 A,所以顺序为 A, B
B
A // 定义 C 的对象,C 继承顺序中第一个是 B,B 继承 A,所以是 A, B
B
A // C 继承顺序中的第二个
C // C 的定义
A // D 中参数 A
D
~D
~A
~C
~A
~B
~A
~B
~A
类内声明:
class D {
public:
D(int a) {
cout << "D: " << a << endl;
}
};
class M {
public:
M() {
cout << 'M' << endl;
extern D d;
}
};
上面的写法不报错,因为没有进行对象的定义,只有对象的声明。所以不需要调用D的构造函数。
包含 static 变量:
class M {
public:
M() {
cout << 'M' << endl;
}
private:
static D d;
};
在不进行 static 对象的定义的情况下,进行 M 对象的定义是不报错的,因为没有用到 D 类的构造函数。也即是 d 只进行了声明没有进行定义。
多区段下构造成员顺序:
class A {
public:
A() {
cout << "A" << endl;
}
~A() {
cout << "~A" << endl;
}
};
class B{
public:
B() {
cout << "B" << endl;
}
~B() {
cout << "~B" << endl;
}
};
class D {
private:
A a;
B b;
public:
D() {
cout << "D" << endl;
}
~D() {
cout << "~D" << endl;
}
private:
B b2;
A a2;
};
输出结果:
A
B
B
A
D
~D
~A
~B
~B
~A
就像上述代码,不管交换访问区还是访问权限,始终都是按照从上到下的顺序进行构造.
c++ 类的构造顺序的更多相关文章
- Java语法专题1: 类的构造顺序
合集目录 Java语法专题1: 类的构造顺序 问题 下面的第二个问题来源于Oracle的笔试题, 非常经典的一个问题, 我从07年开始用了十几年. 看似简单, 做对的比例不到2/10. 描述一下多级继 ...
- c# 衍生类和基类的构造顺序
public class MyDeriveClass :MyBaseClass { public MyDeriveClass() :base() { } int derive_int = 1; } p ...
- C++浅析——继承类中构造和析构顺序
先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象: static int nIndex = 1; class CMember { public: CMember() { p ...
- C++类继承中,基类/当前对象属性/当前对象的构造顺序
[1]中提到,规范的派生类构造函数三个要点: 首先创建基类对象 应通过成员初始化列表,创建基类对象 应该初始化本派生类新增的成员变量 那在构造派生类实例的过程中,其基类(以及多继承的时候多个基类)/当 ...
- 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & ...
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- java类的初始化顺序
在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图: 一.单类(无基类)下的初始化顺序: public class Parent { stat ...
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...
- C++ 类 、构造、 析构、 重载 、单例模式 学习笔记及练习
一.拷贝构造函数 1.是一种特殊的构造函数,就是用一个已有的对象去构造其同类的副本对象,即对象克隆. class 类名 { 类名(类名& that) { 对类成员挨个赋值 ... } } 练习 ...
随机推荐
- 【HDU4336】Card Collector(Min-Max容斥)
[HDU4336]Card Collector(Min-Max容斥) 题面 Vjudge 题解 原来似乎写过一种状压的做法,然后空间复杂度很不优秀. 今天来补一种神奇的方法. 给定集合\(S\),设\ ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...
- 【bzoj2806】 Ctsc2012—Cheat
http://www.lydsy.com/JudgeOnline/problem.php?id=2806 (题目链接) 题意 给出M个字符串组成“标准库”.定义L表示将一个字符串分成若干段,每一段的长 ...
- 使用regsrv32.exe绕过应用程序白名单(多种方法)
0x00 regsvr简介 regsvr32表示Microsoft注册服务.它是Windows的命令行实用工具.虽然regsvr32有时会导致问题出现,但它是Windows系统文件中的一个重要文件.该 ...
- debian修改默认编辑器
刚才在一台机器上打开 crontab -e,跳出来的编辑器是nano,太难使... 在debian下是使用 update-alternatives 命令修改默认编辑器. 先查看一下使用帮助 # upd ...
- ButterKnife注入注解框架用法
Android 依赖注入 ButterKnife 基本使用 - 渐行渐远渐无声 - 博客园http://www.cnblogs.com/fansen/p/5653887.html ButterKnif ...
- [CQOI2016] 手机号码 (数位dp)
link $solution:$ $10^{10} \leq L \leq R < 10^{11}$这个数据范围很容易想到数位$dp$. 依照题意模拟即可. #include<iostre ...
- centos systemctl daemon-reload 提示 no such file or directory 的一个原因
service 的文件名写错了 比如 mongodb.service 写成了 mongodb.srvice 真的是坑,居然没有提示具体的路径,只是提示一个 no such file or direct ...
- 外网IP和内网IP的区别
这两天遇到一个bug,折腾的够呛,已经上线的项目,出现了个人登录不上的情况,瞬间整个人都不好了,首先找问题,在本地和测试服务器上都没问题,打包发布到正式环境就出现问题了,刚开始我看不了日志,日志要找别 ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...