派生类和析构函数的构造规则

简介: 派生类和析构函数的构造规则

目录

前言

简单的派生类的构造函数和析构函数

派生构造函数的一般形式

含有子对象的派生类的构造函数


前言

从之前的学习中我们了解了派生类,中的构造函数和析构函数在类的继承之中的调用顺序,看完以下这篇文章,你大概就会了解派生类中构成函数以及析构函数之间的构造规则

简单的派生类的构造函数和析构函数

首先我们来讲一讲简单的派生类,所谓简单的派生类,就是指他只有一个基类,并且只有一级派生(因为只有直接派生类没有间接派生的一说)并且在派生类中的数据成员是不包含基类的对象及子对象的,下面就来探讨一下在一些简单的派生类中定义构造函数,首先如果基类的构造函数是没有参数或者没有显示的定义构造函数的时候,派生类是一般不能像基类传递参数的,甚至都可以不定义构造函数也行

派生构造函数的一般形式

派生类名(参数总表):基类名(参数表){
    派生类新增数据成员的初始化语句
}

在上面这个例子中,基类的构造函数的参数通常是从带派生类构造函数的总表中得来的,但当然也可以使用常数值,注意的是我们在派生类中可以根据自己的需求来定义属于自己的析构函数,可以用它来进行对派生类中所增加的成员进行清理工作,并且基类的清理工作,我们主要是由基类当中的析构函数负责的,但是由于析构函数不带参数的这一特性,在派生类中要自己判断所定义的析构函数与它对应的基类的析构函数是否无关,最后再执行或者调用派生类的析构函数中,我们的系统才会自动帮我们调用它基类所处的析构函数,对基类的对象进行清理,达到内存的释放

下面我们就来举一个基类中含有参数的构造函数,在派生类中构造函数,析构函数的构造方法的例子

 

#include<iostream>
using namespace std;
class B {
public:
  B(int n) {
    cout << "B类中的构造函数正在使用……" << endl;
    i = n;
  }
  ~B() {
    cout << "B类中的析构函数正在使用……" << endl;
  }
  void Funci() {
    cout << "i = " << i << endl;
  }
private:
  int i;
};
class A:public B {
public:
  A(int n,int m):B(m){
    cout << "A类中的构造函数正在使用……" << endl;
    j = n;
  }
  ~A() {
    cout << "A类中的析构函数正在使用……" << endl;
  }
  void Funcj() {
    cout << "j = " << j << endl;
  }
private:
  int j;
};
int main() {
  A obj(50, 60);
  obj.Funci();
  obj.Funcj();
  return 0;
}

输出结果:

B类中的构造函数正在使用……

A类中的构造函数正在使用……

i = 60

j = 50

A类中的析构函数正在使用……

B类中的析构函数正在使用……

含有子对象的派生类的构造函数

在前面我们介绍过派生类,他们的数据类型都是标准的类型,如int等或者系统提供的类型如string但是实际上派生类中的数据成员还可以是基类的对象,我们把它称之为子对象或者叫对象中的对象

当派生类中含有子对象的时候,它的构造函数的一般形式是:

派生类名(参数总表):基类名(参数表 0),子对象名1(参数(表 1),…,子对象名n(参数表 n){
}
    派生类新增成员的初始化语句
}

在定义派生类的对象时,构造函数对它们的调用顺序是如下,先调用基类中的构成函数,把基类中的数据成员进行初始化,然后再调用子对象中的构造函数,将子对象中的数据成员进行初始化,最后才是调用派生类中的构造函数体,对派生类成员中的数据成员进行初始化

相关文章
|
API 数据库 数据安全/隐私保护
利用Django框架构建高效后端API服务
本文将介绍如何利用Django框架构建高效的后端API服务。通过深入分析Django框架的特性和优势,结合实际案例,探讨了如何利用Django提供的强大功能来构建高性能、可扩展的后端服务。同时,还对Django框架在后端开发中的一些常见问题进行了解决方案的探讨,并提出了一些建设性的建议。
349 3
|
监控 Java 数据安全/隐私保护
Spring AOP实现原理及其在企业应用中的实际应用
Spring AOP实现原理及其在企业应用中的实际应用
|
9月前
|
机器学习/深度学习 存储 算法
《强化学习算法在动态环境中的优化之路》
强化学习是一种通过与环境交互以最大化累积奖励为目标的学习方法。在动态环境中,算法面临探索与利用的平衡、学习速度和稳定性等挑战。优化方法包括改进探索策略(如随机探索、基于策略的探索)、提高学习速度(如多步学习、并行学习)和增强稳定性(如经验回放、正则化)。案例表明,这些优化可显著提升智能体在动态环境中的适应能力和性能。
496 20
|
11月前
|
Ubuntu Java iOS开发
MacOS环境-手写操作系统-00-开篇 简单成品介绍
MacOS环境-手写操作系统-00-开篇 简单成品介绍
154 14
|
11月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
404 3
|
存储 Kubernetes API
JuiceFS-开源分布式文件系统入门(一篇就够了)(上)
JuiceFS-开源分布式文件系统入门(一篇就够了)(上)
703 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的宠物领养系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的宠物领养系统的详细设计和实现
222 2
|
存储 Python
用Python实现批量下载文件——代理ip排除万难
用Python实现批量下载文件——代理ip排除万难
193 2
|
JavaScript 小程序 Java
交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)
交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)
183 0

热门文章

最新文章