本文重要介绍普通继承中如何写派生类的六个默认成员函数,主要是针对在派生类中,如何调用基类的六个默认成员函数

需要说明的一点就是,如果子类中没有调用父类的函数时,系统会自动生成一个。

构造函数

子类中有父类的成员,子类首先需要调用父类的构造函数,然后调用自己的构造函数。如果没有调用父类的构造函数,系统会自动生成一个。

在构造函数中,我们使用父类的匿名对象完成初始化。看下面的代码

class A
{
public:A(int a = 0):_a(a){}
private:int _a;
};class B : public A
{
public:B(int a = 0,int b = 1):A(a),_b(b){}
private:int _b;
};

上面的例子我们可以看出来,当我们写子类B的构造函数的时候,首先需要先调用 父类的匿名构造函数,完成对子类中包含的父类成员的初始化的工作。

拷贝构造函数

拷贝构造函数需要和构造函数区分开,因为我们的构造函数的参数是可变的,我们可以根据需要,为子类中包含的父类成员传递参数,但是在拷贝构造函数中,我们只能够传递的是子类的对象的引用,但是这个时候我们实际上还是可以调用父类的拷贝构造函数的,根据我们上一篇文章中学习过的赋值兼容规则,子类的对象是可以赋值给父类的对象的,所以这个时候我们可以拿子类的对象去实例化子类中包含的父类成员。此时实际上采用 的还是父类匿名对象。

拷贝构造函数应该写成是下面的形式

B(const B& b):A(b),_b(b._b){}

这里语法规定子类中初始化父类的时候,必须在初始化列表中初始化父类,包括我们上面的构造函数也是这个样子,必须在初始化列表中初始化父类

赋值运算符的重载

拷贝构造函数应该如何使用呢,还是上面的思想,我们需要那子类的对象去为父类赋值,所以这个时候,我们可以在子类的赋值运算符重载的函数内部,调用父类的赋值运算符重载的函数,对父类的对象进行赋值。

B& operator=(const B& b){if (this != &b){operator=(b);_b = b._b;}return *this;}

但是上面的问题,会出现一个问题就是,栈溢出,为什么会出现这样的问题呢,主要是在调用父类的赋值运算符重载的 时候,实际上是并没有调用父类的赋值运算符重载,这里调用的是子类的,这样子就形成了递归了,然后会一直调用下去。

解决办法是这样的,我们需要在调用父类的函数前面加上一个作用域限制符。
A::operator(b);

这里为什么会调用子类的赋值运算符的重载呢,实际上是子类的函数名和父类的函数名构成了重定义,这个时候如果不加上作用域限制符就会出现问题了

析构函数

这里在写子类的析构函数的时候,是不允许子类调用父类的析构函数的,有两个原因

  • 因为栈帧的关系,后开辟的空间先释放掉,意思就是说,父类是先开辟的空间,应该后释放,为了防止程序员写错代码,先释放了父类的,这个时候就会出现问题,所以要求自动的调用父类的析构函数
  • 如果我们在实现析构函数的时候,忘记释放了,这个时候就会造成内存泄漏了,造成资源的浪费

基于上面的一些原因,要求就是只需要由系统自动的调用父类的析构函数即可。

继承和多态 2.0 -- 继承的六个默认成员函数相关推荐

  1. 【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数

    文章目录 一.类的6个默认成员函数 二.构造函数 1.概念 2.特性 2.1特征分析--自动生成 2.2.特征分析--选择处理 2.3特征分析--默认构造 3.C++11补丁--缺省值 三.析构函数 ...

  2. C++类与对象(二) 六个默认成员函数

    目录 1.构造函数 (1)引入 (2)性质与验证 (3)总结 2.析构函数 (1)概念 (2)性质与验证 (3)总结 3拷贝构造函数 (1)概念 (2)性质与验证 (3)总结 4.赋值运算符重载 (1 ...

  3. 继承和多态 1.0 -- 继承概念(is-a、has-a,赋值兼容规则,隐藏重定义)

    普通继承和访问权限 当一个继承没有虚拟继承或者是多重继承时,就是一个简单的继承的时候,这个时候就是一个普通的继承. 普通继承的内存空间是:子类的对象中,包含了父类的成员变量,同时也可以调用父类的成员函 ...

  4. Java三大特性(封装,继承,多态)之一 -----继承

    目录 一.继承的基本概念与规则 1.继承的概念 2.继承的关键字 3.继承的结果 二.继承代码 1.继承之---最简单继承 2.继承之---构造器加入 3.继承之---多态转型 3.继承之---抽象类 ...

  5. C++>继承,继承方式及其比较,子类和父类对象指针,派生类的默认成员函数,虚继承,继承与友元,继承与静态成员

    继承 继承的概念与定义 概念: 继承是指一个子类(或称为派生类)继承父类(或称为基类)的特征(属性和操作).继承是面向对象程序设计时实现代码复用的重要手段,它允许在原有的类的基础上进行扩展,增加功能, ...

  6. C++类的六个特殊成员函数20220226

    ------------------------------------------------ 1.设置六个函数的参数,先让函数运行起来 1.1 test/Student.h #include &l ...

  7. 继承和多态 3.0 -- 菱形继承

    单继承和多继承 C++的继承方式是支持单继承和多继承的,首先看一下代码,分清单继承和多继承 单继承 class A { public:int _a; };class B :public A { pub ...

  8. php购物网站类的继承和多态,类的继承与多态

    实例 /** * 对象三要素之: 继承与多态 * 1. 继承是指类之间的继承,是代码复用的重要手段,之前我们是通过"函数"实现的代码复用 * 2. 继承使用关键字: extends ...

  9. java继承和多态_Java基础继承与多态

    Java基础第九天 继承概述 引入 首先我来写两个代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15//定义学生类 class Student { public void  ...

最新文章

  1. java正则表达式的用法_Java 正则表达式的使用
  2. ASN.1 Editor
  3. ant中的loading按钮使用
  4. elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API
  5. 织梦后台如何生成站点地图sitemap.xml
  6. jquery extend中
  7. 关于C# 模仿千千静听 磁铁窗体 的个人的一个思路
  8. (day 22 - 全排列问题 dfs+剪枝+回溯 )剑指 Offer 38. 字符串的排列
  9. 详解百度地图API之地图操作
  10. monkey测试介绍
  11. 支持免费的PCB计算机辅助设计软件eagle
  12. 每天有数百人搜索App破解,开发者该怎么保护自己的手机应用呢?
  13. Windows进程管理
  14. html特殊符号圆点,HTML特殊符号(字符实体)大全
  15. uniapp使用uni-ui插件的方式
  16. Ajax之三 Ajax服务器端控件
  17. 基于vue-cli快速构建
  18. Android 通过appt.exe获取已安装apk的版本信息
  19. D17 LeetCode 2043.简易银行系统(中等)
  20. 北斗三号频点_北斗三代多模多频四通道射频芯片、多模多频三通道射频芯片、海豚一号”——全系统全频点卫星导航军民两用高精度基带芯片等...

热门文章

  1. 获取request的变量
  2. Java学习-jsp内置对象Session
  3. 数据库SQL优化大总结之百万级数据库优化方案
  4. BaseTDI.sys 瑞星卡巴冲突,导致机器蓝屏
  5. .net导出到Excel与Word中(带上下标)
  6. usaco The Tamworth Two 两只塔姆沃斯牛
  7. usaco Controlling Companies
  8. pg 主键系统信息_神仙打架:PG 和 MySQL 到底哪个更好用?
  9. 侏罗纪怪兽世界怎么登陆服务器未响应,全金属怪物进不去怎么解决
  10. 双表查询java代码_什么是JDBC?Java数据库连接性简介