首页 > 继承和多态 2.0 -- 继承的六个默认成员函数

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

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

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

构造函数

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

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

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);

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

析构函数

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

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

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

更多相关:

  • 草色新雨中, 松声晚窗里。之前我们学习 Power Query 都是用鼠标就完成了很多复杂的操作。虽然 PowerQuery 已经将大部分常用功能内置成到功能区。基本能完成我们大部分的报表自动化功能。但是总有些复杂的或者个性化的问题是开发团队没有预先想到的,这时我们就需要学习 M 语言。一、M 语言在哪里?M语言的函数公式有三个地...

  • 前言从2020年3月份开始,计划写一系列文档--《小白从零开始学编程》,记录自己从0开始学习的一些东西。第一个系列:python,计划从安装、环境搭建、基本语法、到利用Django和Flask两个当前最热的web框架完成一个小的项目第二个系列:可能会选择Go语言,也可能会选择Vue.js。具体情况待定,拭目以待吧。。。基本概念表达式表...

  • 1.1函数1.1.1什么是函数函数就是程序实现模块化的基本单元,一般实现某一功能的集合。函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能,进行一系列的逻辑运算return 返回值:函数的返回值能表示函数的运行结果或运行状态。1.1.2函数的作用函数是组织好的,可重复使用的,用来...

  • 原标题:基于Python建立深度神经网络!你学会了嘛?图1 神经网络构造的例子(符号说明:上标[l]表示与第l层;上标(i)表示第i个例子;下标i表示矢量第i项)单层神经网络图2 单层神经网络示例神经元模型是先计算一个线性函数(z=Wx+b),接着再计算一个激活函数。一般来说,神经元模型的输出值是a=g(Wx+b),其中g是激活函数(...

  • 在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重。小编刚开始学习的时候也会有这个感觉。不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个。今天小编就把常用的函数汇总一下,为大家能够能好的学习MySQL中的函数。MySQL常使用的函数大概有四类。时间函数、数学函数、字符函数、控制函数。让我...

  • 假如 父类 int num =7;子类 int num =9;父类是否会被子类所覆盖? 给你看两个例子: 第一个例子:   第二个例子:   这两个例子的区别只有一句话   由此证明了子类从父类继承的时候  如果有同名的成员变量 默认情况下 父类的成员变量是被屏蔽的   如果你非要调用父类的成员变量  请使用super关键字 转...

  • 继承 一,概述 a)         使用extends关键字可以让一个类继承另一个类,继承的类为子类,被继承的类是父类,子类会自动继承父类的所有方法和属性。 b)        继承使得类和类之间产生了关系 c)        子类可以使用super调用父类成员 d)        继承的最终目的就是提高代码的复用性。 e)&nb...

  • 1.访问控制(笔试题)1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问权限 本类 本包中的类 子类 其他包的类-------------------------------------------------...