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) { 对类成员挨个赋值 ... } } 练习 ...
随机推荐
- BZOJ 3224 普通平衡树 | 平衡树模板
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...
- 【转】rt-thread的位图调度算法分析
序言 期待读者 本文期待读者有C语言编程基础,后文中要分析代码,对其中的一些C语言中的简单语句不会介绍,但是并不要求读者有过多的C基础,比如指针和链表等不会要求太多,后面在分析代码时,会附带地介绍相关 ...
- 【转】vi编辑只读文档无法保存的解决办法
vi编辑只读文档无法保存的解决办法 使用普通用户编辑nginx.conf 等配置文件: 保存的时 候会提示:没有Root Permission 可以用如下方法解决:保存时加上::w !sudo tee ...
- Mac上安装python3并设置SublimeREPL插件默认运行python3
1.安装python3 $ brew search python $ brew install python3 这里安装完后不需要单独添加环境变量,程序已经处理好,可以直接运行python3命令. $ ...
- Java的基本类型
基本数据类型的加载和存储 极客时间深入理解Java虚拟机读后感,有错误还请指正 虚拟机中的Boolean类型 在Java语言规范中,boolean类型的值只有两种可能,那就是"true&qu ...
- Android O 正式版新功能
ref: Android O新特性和行为变更总结zzhttp://www.cnblogs.com/bluestorm/p/7148134.html Android O正式版带来了诸多新功能,如Tens ...
- SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 D. 白色相簿
从某一点开始,以层次遍历的方式建树若三点a.b.c互相连接,首先必先经过其中一点a,然后a可以拓展b.c两点,b.c两点的高度是相同的,若b(c)拓展时找到高度与之相同的点,则存在三点互相连接 //等 ...
- winscp以命令行方式同步服务器数据到PC机磁盘上
目前服务器上每日会产生备份文件,需要使用winscp工具把备份同步到本地PC机硬盘上.平时都是图形界面用鼠标点击方式来同步的,效率低下,因此编写了winscp自动同步脚本,并加入到计划任务中定时自动运 ...
- linux命令总结之route命令
route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以下问题:该Linu ...
- python函数的 全局变量与局部变量
一.函数的全局变量 1.什么是全局变量 顶着头开始写,没有任何缩进,在py文件的任何位置都能调用 #!/usr/bin/env python # _*_ coding:utf8 _*_ name=&q ...