C++父类与子类间构造,析构,拷贝的调用关系

构造

子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数

  • 默认执行无参构造
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;class Base
{char *str;public:Base(void){cout << "父类无参构造" << endl;}Base(const char *str){this->str = new char[strlen(str) + 1];cout << "父类有参构造" << str << endl;}
};class A : public Base
{
public:A(void){cout << "子类无参构造" << endl;}A(const char *str)// : Base(str){cout << "子类有参构造" << str << endl;}
};int main()
{A a("h");
}

运行结果:

wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类无参构造
子类有参构造h
  • 显式调用有参构造,在子类的构造函数后,初始化列表中显式调用父类的有参构造函数
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;class Base
{char *str;public:Base(void){cout << "父类无参构造" << endl;}Base(const char *str){this->str = new char[strlen(str) + 1];cout << "父类有参构造" << str << endl;}
};class A : public Base
{
public:A(void){cout << "子类无参构造" << endl;}A(const char *str) : Base(str){cout << "子类有参构造" << str << endl;}
};int main()
{A a("h");
}

运行结果

wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造h
子类有参构造h

析构

子类在它的析构函数执行完后,会根据继承表的顺序逆序执行父类的析构函数

  • 注意: 父类的指针可以指向子类对象,当通过父类指针释放对象时,只会调用父类的析构函数,而这种析构方式有可能造成内存泄漏
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;class Base
{char *str;public:Base(void){cout << "父类无参构造" << endl;}Base(const char *str){this->str = new char[strlen(str) + 1];cout << "父类有参构造" << str << endl;}~Base(void){cout << "父类析构" << endl;}
};class A : public Base
{
public:A(void){cout << "子类无参构造" << endl;}A(const char *str) : Base(str){cout << "子类有参构造" << str << endl;}~A(void){cout << "子类析构" << endl;}
};int main()
{A *a = new A("xixi");delete a;cout << "----------------" << endl;Base *b = new A("haha");delete b;
}

运行结果

wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造xixi
子类有参构造xixi
子类析构
父类析构
----------------
父类有参构造haha
子类有参构造haha
父类析构

拷贝构造
当使用子类对象来初始化新的子类对象时,会自动调用缺省的拷贝构造函数,并且会调用父类缺省的拷贝构造函数

  • 如果子类中实现了拷贝构造,需要显式调用父类拷贝构造,否则就会调用无参构造
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;class Base
{
public:char *str;Base(void){cout << "父类无参构造" << endl;}Base(const char *str){this->str = new char[strlen(str) + 1];cout << "父类有参构造" << str << endl;}Base(Base &that){cout << "父类拷贝构造" << endl;}
};class A : public Base
{
public:A(void){cout << "子类无参构造" << endl;}A(const char *str) : Base(str){cout << "子类有参构造" << str << endl;}A(A &that) : Base(that){cout << "子类拷贝构造" << endl;}
};int main()
{A a("x");cout << "------" << endl;A a1 = a;cout << "------" << a.str << endl;
}

运行结果(子类中不重载拷贝构造)

wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造x
子类有参构造x
------
父类拷贝构造
------

运行结果(子类中重载拷贝构造但不显式调用父类拷贝构造)

wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造x
子类有参构造x
------
父类无参构造
子类拷贝构造
------

运行结果(子类中重载且显式调用父类拷贝构造)

wcq@DESKTOP-PL6DIJT:~/code$ cd "/home/wcq/code/" && g++ test.cpp -lpthread -o test.out && ./test.out
父类有参构造x
子类有参构造x
------
父类拷贝构造
子类拷贝构造
------

C++父类与子类间构造,析构,拷贝的调用关系相关推荐

  1. 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学

    <深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...

  2. 父类与子类间的隐藏与重写

    父类与子类间的隐藏与重写例子(改写一题面试题) (1)隐藏 当分别位于父类和子类的两个方法完全一样时,调用哪个方法由对象变量的类型决定. using System; public class A { ...

  3. 父类和子类间引用要注意的问题

    父类和子类间引用要注意的问题(索创java上第六章) 在发生数据隐藏的情况下(数据隐藏指子类中拥有与父类某属性相同的属性,父类的属性必须通过super才能访问到),父类和子类的声明引用的是同一个子类对 ...

  4. Effective C++学习笔记——构造/析构/拷贝运算

    条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数. 应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会 ...

  5. C++中的trivial和non-trivial构造/析构/拷贝/赋值函数及POD类型

    在侯捷的<STL源码剖析>里提到trivial和non-trivial及POD类型,相关知识整理如下. trivial意思是无意义,这个trivial和non-trivial是对类的四种函 ...

  6. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

  7. 父类和子类方法的调用

     由于没有找到想要的解释,于是自己就在idea上自测来寻找答案. 关于父类,子类,多态之间方法的调用. package 思考;public class 子类调用 {public static void ...

  8. C++之继承探究(十二):子类的构造、析构和赋值运算符重载

    涉及到本文所讲知识点的博文: C++之析构函数探究 C++之常引用和浅拷贝探究 C++之一个函数链的简单例子(分文件实现) C++之Big Three:拷贝构造.拷贝赋值.析构函数探究 C++之操作符 ...

  9. 侯捷-C++面向对象高级开发(三大函数:拷贝构造,拷贝赋值,析构)

    侯捷-C++面向对象高级开发(三大函数:拷贝构造,拷贝赋值,析构) 三大函数:拷贝构造,拷贝赋值,析构 第一个是拷贝构造,第二个是拷贝赋值 编译器有一套默认的东西实现这俩东西,可用到complex的实 ...

最新文章

  1. 一、Focal Loss理论及代码实现
  2. 【Python】pandas 1.3版本主要更新内容一览
  3. c 调用c语言形参为double,C学生作业,’%f’需要’float *’类型的参数,但参数2的类型为’double *’...
  4. oracle 10741 trace,RedHat5.3上安装Oracle 10.2.0.1
  5. 京东、宅急送的微服务实践分享(下)| 架构师小组交流会
  6. 企业版php自动发卡平台,企业版PHP自动发卡平台源码V6.3版
  7. Aspack壳手动脱壳
  8. 微信公众号开发实战 | 01:环境配置
  9. 第二周:java异常和常用类 容器
  10. 2022卡塔尔世界杯:跨境卖家如何用YouTube进行营销?
  11. 苹果芯片订单立功 台积电股价创新高
  12. JSRPC: WebSocket报错 Refused to connect to ‘ws:<URL>/ws?group=testname=wangluozhe‘ because it violate
  13. 机器学习之梯度提升决策树(GBDT)
  14. 使用while循环语句与自增运算符循环遍历数组 (Java经典编程案例)
  15. 有趣且鲜为人知的 Python 特性,火了!
  16. 湖北省小学生计算机大赛,市教育局关于组织参加省2019年度中小学电脑制作活动的通知...
  17. 计算机系统大作业——程序人生
  18. 搜索热词自定义多样式视图
  19. 一篇优秀的论文是怎么写出的?
  20. Matlab自用版灰色关联度模型

热门文章

  1. 【基础知识】SPI通信协议
  2. OpenGL中的颜色混合功能(一)
  3. idea搜不到子目录下的配置怎么解决
  4. 使用PS去水印的方法
  5. [BJDCTF2020]ZJCTF,不过如此
  6. CH340 MAC驱动使用教程
  7. 基于体素化方法的点云降采样
  8. 浅谈python(我心目中的python)
  9. 安卓开发为什么选择用Java语言
  10. 阿里入股新浪微博:动机与前景分析