#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 运算符正确析构动态对象
*/
c++继承过程中为什么要将基类的析构函数声明为虚函数???
猜你喜欢
转载自blog.csdn.net/baixiaolong1993/article/details/89203996
今日推荐
周排行