本文用来测试C++基类和派生类构造函数,析构函数,和拷贝构造函数的调用次序。
运行环境:SUSE Linux Enterprise Server 11 SP2  (x86_64)

#include <iostream>
using namespace std;

class Base
{
public:
    Base()
    {
        cout << "Base Constructor" << std::endl;
    }

Base(const Base& other)
    {
        cout << "Base Copy Constructor" << std::endl;
    }

virtual ~Base()
    {
        cout << "Base Destructor" << std::endl;
    }

const Base & operator = (const  Base& other)
    {
        cout << "assignment operator" << std::endl;
    }
};

class Derived: public Base
{
public:
    Derived()
    {
        cout << "Derived Constructor" << std::endl;
    }

Derived(const Derived& other)
    {
        cout << "Derived Copy Constructor" << std::endl;
    }

virtual ~Derived()
    {
        cout << "Derived Destructor" << std::endl;
    }

const Derived & operator = (const  Derived& other)
    {
        cout << "assignment operator" << std::endl;
    }
};
==============================================================
A. 测试派生类对象
int main(int argc, char *argv[])
{
    Derived d1;
    return 1;
}
输出:
Base Constructor
Derived Constructor
Derived Destructor
Base Destructor

结论: 
1.先构造父类,才构造子类,没有父亲,哪有儿子啊!
2.即使子类(派生类)没有显式(explicit)的调用(在初始化列表中调用)父类(基类)的构造函数,父类的构造函数也会被调用;
================================================================
B. 测试基类的拷贝构造函数
int main(int argc, char *argv[])
{
    Base b1;
    cout << "b1 constructed done" <<  std::endl;
    Base b2 = b1;
    cout << "b2 constructed done" <<  std::endl;
    Base b3(b2);
    cout << "b3 constructed done" <<  std::endl;

return 1;
}

输出结果:
Base Constructor
b1 constructed done
Base Copy Constructor
b2 constructed done
Base Copy Constructor
b3 constructed done
Base Destructor
Base Destructor
Base Destructor

结论:
1. 代码: "Base b2 = b1;" 和 "Base b3(b2);"
将调用拷贝构造函数,而不是其它的(赋值、构造)函数;

扩展: 函数参数传值调用也会调用拷贝构造函数
添加函数:
void Func(Base b)
{
}

int main(int argc, char *argv[])
{
    Base b1;
    cout << "b1 constructed done" <<  std::endl;
    Func(b1);
    return 1;
}
输出结果:
Base Constructor
b1 constructed done
Base Copy Constructor
Base Destructor
Base Destructor

可见: 函数参数传值调用也会调用拷贝构造函数
==================================================================
C. 测试派生类的拷贝构造函数
int main(int argc, char *argv[])
{
    Derived b1;
    cout << "b1 constructed done" <<  std::endl;
    Derived b2 = b1;
    cout << "b2 constructed done" <<  std::endl;
    Derived b3(b2);
    cout << "b3 constructed done" <<  std::endl;

return 1;
}
输出结果:
Base Constructor
Derived Constructor
b1 constructed done
Base Constructor
Derived Copy Constructor
b2 constructed done
Base Constructor
Derived Copy Constructor
b3 constructed done
Derived Destructor
Base Destructor
Derived Destructor
Base Destructor
Derived Destructor
Base Destructor

结论:
1. 派生类的拷贝构造函数被调用前,会调用子类的构造函数;

C++派生类与基类构造函数调用次序相关推荐

  1. testbed笔记:基类或者成员对象的构造函数调用问题

    testbed笔记:基类或者成员对象的构造函数调用问题@TOC testbed笔记:基类或者成员对象的构造函数调用问题 testbed在run driver时候报错: 错误1 找不到基类构造函数 错误 ...

  2. C++ 类继承:构造函数与析构函数调用顺序,派生类和基类之间的特殊关系,公有继承及其他

    文章目录 一.派生类构造函数与基类构造函数 二.创建与销毁派生类对象时,构造函数和析构函数的调用 三.派生类和基类之间的特殊关系 四.公有继承 (一).何为公有继承 (二).多态公有继承 (三).虚函 ...

  3. C++学习记录:派生类向基类转换及其可访问性

    知乎有很多博主学不会了一言不合就抄书,我觉得这对学习计算机科学是一样的. 这里说一个自己或许也有许多人都会也不太注意的点,派生类向基类转换及其可访问性,抄自<C++ Primer>. 派生 ...

  4. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一.不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初 ...

  5. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  6. 【C++ Priemr | 15】派生类向基类转换的可访问性

    1. 只有当D公有继承B时,用户代码才能使用派生类向基类的转换:如果D私有继承B的方式是受保护的或者私有的,则用户代码不能使用该转换. class A {}: class B : public A { ...

  7. 派生类对基类成员的访问控制之公有继承

    公有继承 前面说过,派生类从基类继承时有三个步骤, 第一个步骤是吸收基类成员,吸收了基类中除构造函数和析构函数之外的所有数据成员和函数成员, 第二个步骤就是修改基类成员,包括修改对基类成员的访问属性和 ...

  8. 派生类从基类继承的过程

    派生类从基类继承的过程 派生类从基类继承的过程可以分为三个步骤:吸收基类成员.修改基类成员和添加新成员. 吸收基类成员就是代码复用的过程,修改基类成员和添加新成员实现的是对原有代码的扩展,而代码的复用 ...

  9. 6-4 派生类使用基类的成员函数

    6-4 派生类使用基类的成员函数 分数 5 全屏浏览题目 切换布局 作者 李廷元 单位 中国民用航空飞行学院 按要求完成下面的程序: 1.定义一个Animal类,成员包括: (1)整数类型的私有数据成 ...

  10. 不同派生方式下基类成员在派生类中的可访问范围属性

    不同派生方式下基类成员在派生类中的可访问范围属性 派生方式 派生方式 派生方式 基类成员 公有派生 私有派生 保护派生 私有成员 不可访问 不可访问 不可访问 保护成员 保护 私有 保护 公有成员 公 ...

最新文章

  1. 五大颠覆性特征带你认识6G网络
  2. mysql 并发 参数_Mysql并发参数调整
  3. InstallShield2013 error 6109
  4. Unity3d 下websocket的使用
  5. 共识协议(8)NPOS提名权益证明
  6. jvm调优:能生成的线程数
  7. jzoj3890-长途旅行【同余最短路】
  8. python初心记录二
  9. nova— 计算服务
  10. python里面的list
  11. mybaties专题
  12. Jmeter中的Bean shell
  13. Windows使用ffmpeg教程
  14. C# “配置系统未能初始化”
  15. Fuzz:插桩技术入门
  16. PPT插入文本框的方法技巧
  17. 远程无人值守批量装机(图文详解)
  18. 为什么要将图片转为base64格式
  19. 数学速算法_简单易学的速算法,贴墙上背,孩子次次数学100分!
  20. plc开关量输入输出模块的选择

热门文章

  1. c语言编程存航线,C语言编程飞机订票系统如何设计?
  2. sublime python配置_sublime python环境配置
  3. python实现洗牌算法_为什么渔民耶茨最有用的洗牌算法?
  4. html中有csstext方法吗,style对象的cssText方法有哪些使用方法
  5. 一个小型网站多少台服务器,小型企业局域网需要服务器的价格在多少左右(40台机器)...
  6. php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别
  7. tcp拥塞控制编程实验c语言代码,C语言 计算机网络TCP拥塞控制模拟程序
  8. LINUX进程调度分析源码,Linux 实时调度(源码分析)
  9. 滑坡的剖面图怎么用计算机绘制,cad怎么画滑坡剖面
  10. java两个线程同时运行_java如何几乎同时结束两个线程