1. 顺序

  先调用基类的构造函数,再调用派生类构造函数。析构顺序相反。

2. 构造函数

  派生类 不用初始化列表调用基类构造函数->调用基类的默认构造函数

  派生类 使用初始化列表调用基类带参构造函数->调用基类相关的带参构造函数

  若派生类有多个构造函数版本,其中任意一个基类的构造函数不匹配,都会出错。

3. 复制构造函数

  派生类 未定义复制构造函数 ->调用基类的复制构造函数(如果有)或默认复制构造函数,和派生类的默认复制构造函数

  派生类 定义了复制构造函数  未使用初始化列表调用基类复制构造函数 -> 调用基类默认构造函数

派生类 定义了复制构造函数  使用初始化列表调用基类复制构造函数 -> 调用基类复制构造函数(如果有)或默认复制构造函数

例子:

#include<iostream>
using namespace std; class A
{
public:
A()
{
cout << "A 默认构造函数" << endl;
}
A(int i)
{
cout << "A A(int i)构造函数" << endl;
}
~A()
{
cout << "A 析构函数" << endl;
}
A(const A & obj)
{
cout << "A 复制构造函数" << endl;
}
}; class B : public A
{
public:
B()
{
cout << "B 默认构造函数" << endl;
}
B(int j):A(j)
{
cout << "B B(int j):A(j)" << endl;
}
~B()
{
cout << "B 析构函数" << endl;
}
B(const B & obj) //调用A的默认构造函数
{
cout << "B 复制构造函数" << endl;
}
//B(const B & obj):A() //调用A的默认构造函数
//{
// cout << "B 复制构造函数" << endl;
//}
//B(const B & obj):A(obj) //调用A的复制构造函数
//{
// cout << "B 复制构造函数" << endl;
//}
}; int main()
{
{
cout << "----------------------" << endl;
B b;
cout << "----------------------" << endl;
B b1();
cout << "----------------------" << endl;
B b2(b);
cout << "----------------------" << endl;
}
return ;
}

【C++】继承时构造函数和析构函数的更多相关文章

  1. C++继承,多重继承,虚继承的构造函数以及析构函数的调用顺序问题

    #include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout < ...

  2. JAVA继承时构造函数的问题

    今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...

  3. python类继承时构造函数的运行问题

    假设子类定义了自己的__init__构造方法函数.当子类的实例对象被创建时,子类仅仅会运行自己的__init__方法函数.假设子类没有定义自己的构造方法函数.会沿着搜索树找到父类的构造方法函数去运行父 ...

  4. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

    一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...

  5. C++类中的一些细节(重载、重写、覆盖、隐藏,构造函数、析构函数、拷贝构造函数、赋值函数在继承时的一些问题)

    1 函数的重载.重写(重定义).函数覆盖及隐藏 其实函数重载与函数重写.函数覆盖和函数隐藏不是一个层面上的概念.前者是同一个类内,或者同一个函数作用域内,同名不同参数列表的函数之间的关系.而后三者是基 ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. C++学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  8. C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?

    摘要 我们都知道,C#中,在类型继承时,由于构造子类必须先构造其父类型的内容,因此,必须子类型的构造函数中调用父类型的构造函数(无参数的不需要显式声明). 但是往往我们会出现,子类型本身的构造函数大于 ...

  9. C++类有继承时,析构函数必须为虚函数

    C++类有继承时,析构函数必须为虚函数.如果不是虚函数,则使用时可能存在内在泄漏的问题. 假设我们有这样一种继承关系: 如果我们以这种方式创建对象: SubClass* pObj = new SubC ...

随机推荐

  1. 浅析Python中的main函数

    Python作为一门较为灵活的解释型脚本语言,其中定义的main()函数只有当该Python脚本直接作为执行程序时才会执行: 当该python脚本被作为模块(module)引入(import)时,其中 ...

  2. lintcode-64-合并排序数组 II

    64-合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 注意事项 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素. 样例 给出 A = [1, 2, 3, ...

  3. Mybatis学习系列(三)动态SQL

    在mapper配置文件中,有时需要根据查询条件选择不同的SQL语句,或者将一些使用频率高的SQL语句单独配置,在需要使用的地方引用.Mybatis的一个特性:动态SQL,来解决这个问题. mybati ...

  4. 获取JavaScript对象的方法

    写定义一个对象,如var a = new Array(),debugger,然后执行F12控制台的开发者模式下,进入断点,断点里面 会显示所有的方法的. var a = new Array(); de ...

  5. 正则awk和查看文件行数

    [root@WebServer aa]# cat oldboy.txt I am oldboy myqq is 49000448[root@WebServer aa]# cat oldboy.txt ...

  6. Xcode 6.0中彻底关闭ARC

    对整个项目关闭ARCproject -> Build settings -> Apple LLVM complier 3.0 - Language -> objective-C Au ...

  7. hihoCoder #1872 : Pythagorean triple

    此题是 2018 年 ICPC Asia Beijing Regional Contest 的 C 题. 题目大意 求斜边长度不超过 $n$($ n \le 10^9$) 的勾股数的数量.不计两直角边 ...

  8. Brainf**k(一位数求max)

    题目大意:给你两个一位数,要你求出其中的较大值(使用$Brainf**k$) ($Brainf**k$简介,相当于有一个数组和一个指针,","为把数组当前位赋值为读入的数,&quo ...

  9. [洛谷P4779]【模板】单源最短路径(标准版)

    题目大意:单元最短路径(卡$SPFA$) 题解:$dijkstra$($\underline{\hspace{0.5em}}\underline{\hspace{0.5em}}gnu\underlin ...

  10. HZOI String STL的正确用法

                                                                      String          3s 512 MB描述硬盘中里面有n ...