1 继承基类的构造函数

class A{public:A(){};  // A的构造函数
};
class B : public A{public:using A:A;
}

2 单继承的构造函数

class A{public:A(int i){};
};
class B : public A{public:B(int i, int j): A(i), bb(j); /i传递给A的构造函数,j初始化bb
private:int bb;
};

3 多继承的构造函数

派生类的构造函数需要给所有基类构造函数传递参数。
多继承时先按声明顺序执行每个基类的构造函数,同时传递参数至对应构造函数。
之后按声明顺序,初始化派生类成员

#include <iostream>
using namespace std;
class Base1 {public:Base1() {cout << "基类1的构造函数" << endl;};Base1(int i) : base1(i) {cout << "基类1的构造函数" << endl;};
private:int base1;
};
class Base2 {public:Base2() {cout << "基类2的构造函数" << endl;};Base2(int i) : base2(i) {cout << "基类2的构造函数" << endl;};
private:int base2;
};
class Base3 {public:Base3() {cout << "基类3的构造函数" << endl;};
};
class Derived : public Base3, public Base2, public Base1 {public:Derived() {  /先按3-2-1的顺序调用基类构造函数,再按1-2-3的顺序创建成员对象,调用Base1-2-3的构造函数cout << "继承类的构造函数" << endl;};Derived(int i, int j, int p, int q) : a(i), b(j), Base1(p), Base2(q){cout << "继承类的构造函数" << endl;};
private:Base1 a;Base2 b;Base3 c;
};
int main() {Derived dd;/ 调用无参数的构造函数cout << endl;Derived d(1, 2, 3, 4);return 0;
}
输出结果:
基类3的构造函数
基类2的构造函数
基类1的构造函数
基类1的构造函数
基类2的构造函数
基类3的构造函数
继承类的构造函数基类3的构造函数
基类2的构造函数
基类1的构造函数
基类1的构造函数
基类2的构造函数
基类3的构造函数
继承类的构造函数

4 派生类复制构造函数

派生类未定义复制构造函数的情况

  1. 编译器会在需要时生成一个隐含的复制构造函数
  2. 先调用基类的复制构造函数,再为派生类新增的成员执行复制

派生类定义了复制构造函数的情况
基类复制构造函数的形参类型是==基类对象的引用

Base(const Base &a) : ...{};

而派生类对象也可以是基类的对象,所以派生类对象的引用可以作为实参

5 派生类的析构函数

构造函数执行顺序: 基类(按声明顺序)-成员对象所属类(按声明顺序)-派生类
析构函数执行顺序:派生类-成员对象所属类(相反)-基类(相反)
和入栈、出栈类似,先构后析,后构先析
可以理解为:如果先析构基类或成员对象所属类,派生类的总体内容就减少了,派生类就无法正常工作了;所以先析构最后创建内存空间的派生类。

#include <iostream>
using namespace std;
class Base {public:Base() {cout << "构造基类" << endl;}~Base() {cout << "析构基类" << endl;}
};
class C {public:C() {cout << "构造C" << endl;}~C() {cout << "析构C" << endl;}
};
class Derived : public Base {public:Derived() {cout << "构造继承类" << endl;}~Derived() {cout << "析构继承类" << endl;}
private:C c;
};
int main()
{Derived d;return 0;
}
运行结果:
构造基类   / Derived继承了Base的成员
构造C     / Derived的成员对象c 调用C的构造函数
构造继承类   / Derived的构造函数执行完毕
析构继承类   / 先析构派生类自己
析构C / 析构成员对象所属类
析构基类 /最后析构基类

6.12C++:继承基类的构造函数、单继承的构造函数、多继承的构造函数、派生类复制构造函数、派生类的析构函数相关推荐

  1. 浅谈C++类(6)--复制构造函数

    欢迎转载,但请标明作者 "九天雁翎",当然,你给出这个帖子的链接更好. 还记得(1)中讲到的构造函数吗?复习一下,这次我们重载一个新的默认构造函数--即当你不给出初始值时调用的构造 ...

  2. 编译器角度看C++复制构造函数

    [C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...

  3. 复制构造函数(拷贝构造函数)

    也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什 ...

  4. C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例

    转载出处:https://blog.csdn.net/sxhelijian/article/details/23209967 对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如: in ...

  5. C++拷贝构造函数(复制构造函数)详解

    link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...

  6. 复制构造函数 与 赋值函数 的区别

    构造函数.析构函数.赋值函数是每个类最基本的的函数.每个类只有一个析构函数和一个赋值函数.但是有很多构造函数(一个为复制构造函数,其他为普通构造函数.对于一个类A,如果不编写上述四个函数,c++编译器 ...

  7. C++ 复制控制之复制构造函数

    7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...

  8. C++中复制构造函数与重载赋值操作符

    我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类:     class C ...

  9. 拷贝构造函数c语言,C++拷贝构造函数(复制构造函数)详解

    复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 复制构造函数的参数可以是 const 引用,也可以是非 const 引用. 一般使用前者,这样既能以常量对象(初 ...

  10. VC++复制构造函数使用的三种情况—整理范磊VC++

    1 上面不执行复制构造函数,17行将10000赋值给a:首先是进行类型转换转化为类(等价18行),然后调用构造函数创建一个临时对象, 并将该临时对象赋给a. 2. 对func函数: 接收的实参是主函数 ...

最新文章

  1. 密码统计分析工具pipal
  2. VS与Win7 共舞:用户界面特权隔离
  3. 王晓东:科学家要耐得住寂寞
  4. 深藏不露,挖掘4种大脑网络中的管理工具
  5. 深入一致性哈希(Consistent Hashing)算法原理
  6. php 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
  7. 抱歉咯!今天偷个懒!!
  8. Linux之内核调试sysrq
  9. 计算机二级考试改错题技巧
  10. python基础教程多少页_看完这篇文章,你的Python基础就差不多了(附200页《Python400集》)...
  11. 【Oracle】RMAN备份
  12. spring boot 使用application.properties 进行外部配置
  13. Json概述以及python对json的相关操作
  14. 使用postman发送post请求下载文件
  15. 20200209毕设日记-开题报告
  16. 计算机原理(CPU+存储+OS+指令)
  17. 算法介绍及实现——马尔可夫链、隐马尔可夫链(附Python实现)
  18. vivado各版本的区别
  19. java 3_4_5判断三角形_小学四年级数学下册【填空题】易错题专项训练
  20. 中国掀起数字化浪潮的4个显著变化

热门文章

  1. linux系统如何完全删除用户
  2. 电脑C盘下的Windows/System32/hkcmd.exe是什么??
  3. Android 电源管理————gotosleep和userActivity关注
  4. javascript控制元素隐藏的方法
  5. vue自定义组件 中如何使用 v-model
  6. mysql注入常用函数(1)
  7. list集合 去重的3个方法
  8. Mysql调优及索引锁机制学习
  9. 生成式对抗网络(GAN, Generaitive Adversarial Networks)总结
  10. java学习#day01(Java常用计算机基础知识、JDk的下载与安装、环境变量的配置、IDEA的下载与安装)