C++面向对象编程:纯虚函数、抽象类、虚析构、纯虚析构

纯虚函数的目的便是,父类不需要去实现,全部都是在子类中实现,有纯虚函数的话,就是抽象类,而且子类必须重写这个纯虚函数。可见以下代码:

cpp 复制代码
#include<iostream>
using namespace std;

class ami {
public:
	virtual void eat() = 0; // 纯虚函数,有纯虚函数的便是抽象类
};

class cat : public ami {
public:
	virtual void eat(){
		cout << "猫猫吃东西" << endl;
	}
};

int main() {
	cat a;
	a.eat();
	return 0;
}

虚析构的话,顾名思义便是析构函数上面也有一个virtual关键字,我们先看下没有virtual关键字的情况:

cpp 复制代码
#include<iostream>
using namespace std;

class class1 {
public:
	 class1(){}
	  ~class1(){
		 cout << "class1类销毁了" << endl;
	 }
};

class class2 :public class1 {
public:
	class2() :Value(NULL) {
		Value = new int(10);
	}
	~class2() {
		cout << "class2类销毁了" << endl;
		delete Value;
	}
	int* Value;
};
int main() {
	class1* b = new class2();
	delete b;
	return 0;
}

输出结果是 父类被销毁了,但是这种会导致内存泄漏。下面便是虚析构的应用,这样就可以避免内存泄漏的情况了

cpp 复制代码
#include<iostream>
using namespace std;

class class1 {
public:
	 class1(){}
	  virtual ~class1(){
		 cout << "class1类销毁了" << endl;
	 }
};

class class2 :public class1 {
public:
	class2() :Value(NULL) {
		Value = new int(10);
	}
	~class2() {
		cout << "class2类销毁了" << endl;
		delete Value;
	}
	int* Value;
};
int main() {
	class1* b = new class2();
	delete b;
	return 0;
}

输出结果显示,两个类均运行了析构函数,成功销毁了对应内容。

下面是纯虚析构的实现,也可以达到同样的结果,两个类也是均运行了析构函数,销毁了对应内容:

cpp 复制代码
#include<iostream>
using namespace std;

class class1 {
public:
	 class1(){}
	 virtual ~class1() = 0;
};

class1::~class1() {
	cout << "class1类销毁了" << endl;
}

class class2 :public class1 {
public:
	class2() :Value(NULL) {
		Value = new int(10);
	}
	~class2() {
		cout << "class2类销毁了" << endl;
		delete Value;
	}
	int* Value;
};
int main() {
	class1* b = new class2();
	delete b;
	return 0;
}
相关推荐
OTWOL2 分钟前
Python的顺序结构和循环结构
开发语言·python
大数据学习爱好者9 分钟前
基于python商品比价系统requests爬虫+可视化+Django框架
大数据·开发语言·python
南宫生29 分钟前
力扣动态规划-26【算法学习day.120】
java·数据结构·算法·leetcode·动态规划
不想编程小谭31 分钟前
从小白开始的动态规划
c++·算法·动态规划
不会敲代码的XW32 分钟前
对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,其各自的优势
开发语言·php
一只码代码的章鱼36 分钟前
数据结构与算法-动态规划-状态机(股票问题,密码设计)
算法·动态规划·代理模式
surtr11 小时前
【C++】RBTree(红黑树)模拟实现
数据结构·c++·算法·stl·map·红黑树·rbtree
关关钧1 小时前
【R语言】t检验
开发语言·r语言
真想骂*1 小时前
Python中是否有类似R语言中rds的功能,可将对象保存为文件?
开发语言·python·r语言
zjkzjk77111 小时前
函数指针(Function Pointer)与 typedef int (*FuncPtr)(int, int);typedef与using(更推荐)
开发语言·c++·算法