c++之虚析构和純虚析构
时间:2022-07-23
本文章向大家介绍c++之虚析构和純虚析构,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码。
解决方式:将父类中的析构函数改为虚函数或純虚函数。
虚析构函数和純虚函数的共性:
- 可以解决父类指针释放子类对象;
- 都需要有具体的函数实现;
虚析构和析构函数的区别:
- 如果是純虚析构,该类属于抽象类,无法实例化对象。
#include<iostream>
using namespace std;
class Animal {
public:
Animal() {
cout << "Animal的构造函数调用" << endl;
}
/*virtual ~Animal() {
cout << "Animal的析构函数调用" << endl;
}*/
//对于纯虚析构,既要有声明,也需要在类外进行实现,
//純虚函数是不需要实现的,只需要声明
virtual ~Animal() = 0;
virtual void speak() = 0;
};
Animal::~Animal() {
cout << "Animal的析构函数调用" << endl;
}
class Cat :public Animal {
public:
string name;
Cat(string name) {
cout << "Cat的Cat(string name)构造函数调用" << endl;
this->name = name;
}
~Cat() {
cout << "Cat的析构函数调用" << endl;
this->name = name;
}
void speak() {
cout << "喵喵喵" << endl;
}
};
class Dog :public Animal {
public:
string name;
Dog(string name) {
cout << "Dog的Dog(string name)构造函数调用" << endl;
this->name = name;
}
~Dog() {
cout << "Dog的析构函数调用" << endl;
this->name = name;
}
void speak() {
cout << "汪汪汪" << endl;
}
};
//这里必须传入地址
//父类的引用指向子类的对象,实现动态多态
void doSpeak()
{
Animal* animal = new Cat("tom");
//父类指针在析构时,不会调用子类中的析构函数。导致了子类中有堆区属性,出现内存泄漏;
//解决方法,将父类析构函数声明为virtual
animal->speak();
delete animal;
cout << "-----------------------" << endl;
animal = new Dog("jack");
animal->speak();
delete animal;
}
int main() {
doSpeak();
system("pause");
return 0;
}
输出:
- 谁能拯救我糟心的出行?
- Python常见数据结构整理 Python常见数据结构整理
- “共享洗车机”落户咸阳,你怎么看?
- 蒋涛——软件是一个非常特殊的产业,一旦进入就再难挣脱
- Pechkin:html -> pdf 利器
- C#执行XSL转换
- javascript:算法笔记
- spring boot 登录注册 demo (一)
- linux学习:CentOS、Mac上SSH的设置以及SceureCRT中的文件上传下载
- 中关村成为北京“高精尖”产业发展主阵地
- jquery-barcode:js实现的条码打印
- 页面json 格式化+颜色高亮
- Python 里 and、or 的计算规则
- Python中赋值、浅拷贝与深拷贝
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法