当前位置: 首页 > news >正文

C++从零开始的打怪升级之路(day41)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于继承的知识点

1.派生类的默认成员函数

首先我们来回顾以下默认成员函数是哪几个

1.构造函数                     完成初始化工作

2.析构函数                     完成清理工作

3.拷贝构造函数              使用同类对象初始化创建新对象

4.赋值重载函数              把一个对象赋值给另一个对象

5.取地址重载函数           普通对象取地址

6.const取地址重载函数  const对象取地址

那么,对于派生类,我们的默认成员函数是怎样的呢

1.派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员,如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用

2.派生类的拷贝构造函数必须调用基类拷贝构造函数完成基类的拷贝初始化

3.派生类的operator=必须要调用基类的operator=完成基类的复制

4.派生类的析构函数会在被调用完后自动调用基类的析构函数清理基类成员,因为这样才能保证派生类对象先清理派生类成员,再清理基类成员的顺序

5.派生类对象初始化先调用基类构造,再调派生类构造(符合栈的先进后出)

6.派生类对象析构清理先调用派生路析构,再调基类析构(符合栈的先进后出)

7.因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲 解)。那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加 virtual的情况下,子类析构函数和父类析构函数构成隐藏关系(多态内容)

class Person
{
public:Person(const char* name = "peter"): _name(name){cout << "Person()" << endl;}Person(const Person& p): _name(p._name){cout << "Person(const Person& p)" << endl;}Person& operator=(const Person& p){cout << "Person operator=(const Person& p)" << endl;if (this != &p)_name = p._name;return *this;}~Person(){cout << "~Person()" << endl;}
protected:string _name; // 姓名
};class Student : public Person
{
public:Student(const char* name, int num): Person(name), _num(num){cout << "Student()" << endl;}Student(const Student& s): Person(s), _num(s._num){cout << "Student(const Student& s)" << endl;}Student& operator = (const Student& s){cout << "Student& operator= (const Student& s)" << endl;if (this != &s){Person::operator =(s);_num = s._num;}return *this;}~Student(){cout << "~Student()" << endl;}
protected:int _num; //学号
};void Test()
{Student s1("jack", 18);Student s2(s1);Student s3("rose", 17);s1 = s3;
}

2.继承与友元

友元关系不能继承,也就是说基类友元不能访问派生类私有和保护成员

很简单理解,这里不贴代码了

3.继承与静态成员

基类定义了static静态成员,则整个继承体系里面只有一个这样的成员,无论拍成出多少个子类,都只有一个static成员

class Person
{
public:static int _count;
};int Person::_count = 0;class Student : public Person
{
public:int _id;
};void Test()
{Student s1;Student s2;Student s3;cout << Person::_count << endl;s1._count = 1;cout << Person::_count << endl;s2._count = 2;cout << Person::_count << endl;s3._count = 3;cout << Person::_count << endl;
}

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!

相关文章:

  • 算法知识(java)随笔
  • 知识图谱1——neo4j
  • 边缘计算网关的重要作用-天拓四方
  • redis一些概念知识
  • PostgreSQL对已有表增加自增序列
  • WPF应用程序使用MVVM模式
  • etcd入门-(1)安装篇
  • Android 11.0 内置google tts语音包功能实现
  • win环境nginx实战配置详解
  • kubeadm部署K8S
  • 2024年【N1叉车司机】考试试卷及N1叉车司机证考试
  • [技巧]Arcgis之图斑四至点批量计算
  • TSINGSEE青犀AI智能分析网关V4智慧油田安全生产监管方案
  • Unity(第九部)物体类
  • CNN中的伯努利分布与二项式分布
  • php的引用
  • httpie使用详解
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nfs客户端进程变D,延伸linux的lock
  • nodejs实现webservice问题总结
  • php面试题 汇集2
  • Python学习笔记 字符串拼接
  • QQ浏览器x5内核的兼容性问题
  • Sass 快速入门教程
  • SwizzleMethod 黑魔法
  • text-decoration与color属性
  • Twitter赢在开放,三年创造奇迹
  • Vue ES6 Jade Scss Webpack Gulp
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Android乐音识别(2)
  • 项目实战-Api的解决方案
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #pragma 指令
  • #pragma预处理命令
  • #QT(串口助手-界面)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (02)Hive SQL编译成MapReduce任务的过程
  • (3)(3.5) 遥测无线电区域条例
  • (pytorch进阶之路)扩散概率模型
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .CSS-hover 的解释
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .Net Web项目创建比较不错的参考文章
  • .Net 知识杂记
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET基础篇——反射的奥妙