【C/C++学习笔记】 虚析构函数,虚基类,虚函数,纯虚函数

本文详细介绍了C++中的虚函数、虚析构函数、纯虚函数和虚基类的概念及其作用。虚函数通过虚函数表实现多态,虚析构函数防止析构子类对象时只调用基类析构函数,纯虚函数使得类成为抽象类,虚基类解决多继承中的命名冲突。文章通过实例展示了这些概念的实际应用。

1. 虚析构函数

在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
(1)当父类的析构函数没有定义为虚析构函数时,对象销毁时只调用了父类的析构函数,而没有调用派生子类的析构函数,会造成子类的内存泄漏问题。

class Cparent
{
public:
	Cparent(){}
	~Cparent()	//非虚析构函数
	{
		std::cout << "~Cparent()!" << std::endl;
	}
};
class Cson : public Cparent
{
public:
	Cson(){}
	~Cson()
	{
		std::cout << "~Cson()!" << std::endl;
	}
};

int test()
{
	Cparent* pCson = new Cson();
	delete pCson;
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

(2)当父类的析构函数为虚析构函数时,对象销毁时会先调用派生子类的析构函数,然后调用了父类的析构函数。
只需将上面的父类虚构函数加个virtual关键字,构成虚析构函数,如下:

class Cparent
{
public:
	Cparent(){}
	virtual ~Cparent()	//虚析构函数
	{
		std::cout << "~Cparent()!" << std::endl;
	}
};

运行结果:
在这里插入图片描述
注意:不存在虚构造函数。

2. 虚函数

虚函数表

虚函数(Virtual Function)是通过一张虚函数表(Virtual Table,简称为V-Table)来实现的。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候(调用的是对应的子类函数),这张虚函数就像一个地图一样,指明了实际所应该调用的函数。

虚函数联系到多态,多态联系到继承。

(1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。
(2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
(3)当将基类中的某一成员函数声明为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值