当前位置:网站首页>继承的注意事项
继承的注意事项
2022-07-31 23:34:00 【华为云】
子类的析构函数会在被调用完成后自动调父类的析构函数清理父类的成员。因为这样才能保证先清理子类成员再清理父类成员的顺序。
- 因为后面多态的原因,任何类的析构函数名都被统一处理为:
destructor(),所以编译器会认为子类的析构函数和父类的析构函数构成隐藏关系 - 为了保证析构时:保持
先子再父的后进先出的顺序析构,子类析构函数完成后,会自动调用父类的析构函数

初始化时:我们时先调用父类的函数初始化父类的那部分,然后再初始化子类的部分, 要符合栈的特征:后进先出
所以析构的时候:要先析构子类的,再析构父类的
//派生类的析构函数~Student(){ cout << "~Student()" << endl;}总结:
//派生类class Student : public Person{public: //派生类的构造函数 Student(const char* name = "Mango", int id = 0) :Person(name) //把父类当成一个整体,显示的初始化 调用基类的构造函数初始化基类的那一部分成员 ,_id(id)//初始化派生类的成员 { //调用父类构造函数初始化继承的父类的部分 //再初始化派生类自己的成员 cout << "Student()" << endl; } //派生类的拷贝构造 Student(const Student& s) :Person(s) //把子类传给父类的引用,是一种切片的行为 调用基类的拷贝构造函数完成基类成员的拷贝构造 ,_id(s._id)//拷贝构造派生类的成员 { //调用父类拷贝构造函数用于拷贝构造继承的父类的部分 //再拷贝构造派生类自己的成员 cout << "Student(const Student& s)" << endl; } //派生类的operator=赋值 Student& operator=(const Student& s) { cout << "Student& operator=(const Student& s)" << endl; //防止自己给自己赋值 if (this != &s) { Person::operator=(s);//调用基类的operator=完成基类成员的赋值 _id = s._id;//完成派生类成员的赋值 } return *this; } //派生类的析构函数 ~Student() { cout << "~Student()" << endl; //派生类的析构函数调用完成后,会自动调用基类的析构函数 }private: int _id;};注意:
派生类对象初始化先调用基类构造再调派生类构造。 (初始化:先父再子)
派生类对象析构清理先调用派生类析构再调基类的析构。(析构:先子再父)
- 派生类和基类的赋值运算符(operator=)重载函数因为函数名相同构成隐藏,因此在派生类当中调用基类的赋值运算符重载函数时,需要使用作用域限定符进行指定调用。
- 由于多态的某些原因,任何类的析构函数名都会被统一处理为
destructor();。因此,派生类和基类的析构函数也会因为函数名相同构成隐藏,若是我们需要在某处调用基类的析构函数,那么就要使用作用域限定符进行指定调用。 - 在派生类的拷贝构造函数和
operator=当中调用基类的拷贝构造函数和operator=的传参方式是一个切片行为,都是将派生类对象直接赋值给基类的引用。 - 基类的构造函数、拷贝构造函数、赋值运算符重载函数我们都可以在派生类当中自行进行调用,而基类的析构函数是当派生类的析构函数被调用后由编译器自动调用的,我们若是自行调用基类的构造函数就会导致基类被析构多次的问题。
- 创建派生类对象时是先创建的基类成员再创建的派生类成员,编译器为了保证析构时先析构派生类成员再析构基类成员的顺序析构,所以编译器会在派生类的析构函数被调用后自动调用基类的析构函数。
题目:设计出一个类A,让这个类不能被继承(继承了也没用)
想法:只需让A的默认构造函数私有即可
因为派生类想创建对象,派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。而如果基类的构造函数无法访问,就不能创建对象。
class A{private: A() {}};class B :public A{};int main(){ B b;//报错,如果不创建对象就不会报错 return 0;}\
边栏推荐
- /etc/sysconfig/network-scripts 配置网卡
- Dry goods | 10 tips for MySQL add, delete, change query performance optimization
- lua入门案例实战1234定义函数与标准函数库功能
- Shell常用脚本:Nexus批量上传本地仓库脚本
- [QNX Hypervisor 2.2 User Manual]9.16 system
- 【读书笔记->数据分析】02 数据分析准备
- [1161. The maximum sum of elements in the layer]
- PHP三元(三目)运算符
- @JsonFormat(pattern="yyyy-MM-dd") time difference problem
- IPD流程专业术语
猜你喜欢

游戏安全03:缓冲区溢出攻击简单解释
![[Cloud Residency Co-Creation] [HCSD Big Celebrity Live Broadcast] Personally teach the secrets of interviews in big factories](/img/7a/278ffada1cc660e7f5c2d7c66fa38e.png)
[Cloud Residency Co-Creation] [HCSD Big Celebrity Live Broadcast] Personally teach the secrets of interviews in big factories
![[Reading Notes -> Data Analysis] 02 Data Analysis Preparation](/img/e7/258daf851746cb043f301437ee3bbe.png)
[Reading Notes -> Data Analysis] 02 Data Analysis Preparation

What is customer profile management?

编译型语言和解释型语言的区别

景区手绘地图的绘制流程

基于mysql的消息队列设计

消息队列消息存储设计(架构实战营 模块八作业)

Advanced Algebra _ Proof _ Any matrix is similar to an upper triangular matrix

TFC CTF 2022 WEB Diamand WriteUp
随机推荐
嵌入式开发没有激情了,正常吗?
简单的vim配置
Unity-通过预制件和克隆方法动态实现各个UGUI下控件的创建和显示
Flutter教程之 01配置环境并运行demo程序 (教程含源码)
vim的基本使用-底行模式
SQL27 View user details of different age groups
【MATLAB项目实战】LDPC-BP信道编码
Pytest初体验
Payment module implementation
MLP神经网络,GRNN神经网络,SVM神经网络以及深度学习神经网络对比识别人体健康非健康数据
不知道该怎么办的同步问题
基于mysql的消息队列设计
HTC using official firmware as bottom bag made ROM brush card bag tutorial
[QNX Hypervisor 2.2用户手册]9.14 set
Daily--Kali opens SSH (detailed tutorial)
Interview Blitz 69: Is TCP Reliable?Why?
博弈论(Depu)与孙子兵法(42/100)
【FPGA教程案例43】图像案例3——通过verilog实现图像sobel边缘提取,通过MATLAB进行辅助验证
一文概述:VPN的基本模型及业务类型
The difference between adding or not adding the ref keyword when a variable of reference type is used as a parameter in a method call in C#