c++继承过程中为什么要将基类的析构函数声明为虚函数???

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>
using namespace std;

class A
{
public:
	A()
	{
		p = new char[200];
		strcpy(p, "AAAAAAAAAAAAAAA");
		cout << "A的构造函数执行完毕" << endl;
	}
	virtual ~A()//虚析构函数
	{
		if (p!=NULL)
		{
			delete[]p;
			cout << "a类析构函数执行完毕" << endl;
		}
	}

private:
	char*p;
};

class B:public A
{
public:
	B()
	{
		p = new char[200];
		strcpy(p, "BBBBBBBBBBBBB");
		cout << "B的构造函数执行完毕" << endl;
	}
	virtual ~B()//虚析构函数
	{
		if (p != NULL)
		{
			delete[]p;
			cout << "B类析构函数执行完毕" << endl;
		}
	}

private:
	char*p;	
};

class C :public B
{
public:
	C()
	{
		p = new char[200];
		strcpy(p, "cccccccccc");
		cout << "C的构造函数执行完毕" << endl;
	}
	virtual ~C()//虚析构函数
	{
		if (p != NULL)
		{
			delete[]p;
			cout << "C类析构函数执行完毕" << endl;
		}
	}

private:
	char*p;
};

//只执行了 父类的析构函数,子类特有的属性没有清理。
//想通过父类指针  把 所有的子类对象的析构函数 都执行一遍
//想通过父类指针 释放所有的子类资源 
void HowToDelete(A*base)//这里是一个父类的指针,如果析构函数没有声明为virtual类型,那么就不会执行 BC类的析构
{
	delete base;//这句话不会表现出多态属性
}

int main(void)
{
	C *myC = new C;//new和delete匹配
	//delete myC;//直接通过子类对象释放资源 不需要写virtual 
	HowToDelete(myC);
	system("pause");
	return 0;
}
/*
 * 当A类的析构函数没有定义为虚函数时候,宕机
 * A的构造函数执行完毕
B的构造函数执行完毕
C的构造函数执行完毕
a类析构函数执行完毕

并不会执行 BC类的构造函数

当给A类的析构函数加上virtual的时候,执行结果如下:
A的构造函数执行完毕
B的构造函数执行完毕
C的构造函数执行完毕
C类析构函数执行完毕
B类析构函数执行完毕
a类析构函数执行完毕
请按任意键继续. . .

也就是说会从子类一直执行到父类的所有继承的类的析构函数
当把子类统一通过父类进行管理内存的时候,就需要在父类里面声明虚析构函数。
//想通过父类指针  把 所有的子类对象的析构函数 都执行一遍
//想通过父类指针 释放所有的子类资源
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数
 析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象


 */

猜你喜欢

转载自blog.csdn.net/baixiaolong1993/article/details/89203996