1.父类析构函数不是虚函数
#include<iostream>
using namespace std;
class Base{
public:
Base()
{
cout<<"Base()"<<endl;
}
~Base()
{
cout<<"~Base()"<<endl;
}
virtual void func()
{
cout<<"func()"<<endl;
}
};
class Dervied:public Base{
public:
Dervied()
{
cout<<"Dervied()"<<endl;
}
~Dervied()
{
cout<<"~Derviede()"<<endl;
}
};
int main()
{
Base *bd = new Dervied; // 父类指针指向了子类对象---此时父类指针只能指向子类的subbase
// 1.new 分配内存 调用base,dervied的构造函数
/*
Base()
Dervied()
~Base()
*/
delete(bd);
// 调用析构函数 若base中析构函数不是虚函数会怎么样?
//bd为Base指针,此时父类指针只能指向子类的subbase,调用析构函数只能调用~Base()
}
2.析构函数为虚函数
#include<iostream>
using namespace std;
class Base{
public:
Base()
{
cout<<"Base()"<<endl;
}
virtual ~Base()
{
cout<<"~Base()"<<endl;
}
virtual void func()
{
cout<<"func()"<<endl;
}
};
class Dervied:public Base{
public:
Dervied()
{
cout<<"Dervied()"<<endl;
}
~Dervied()
{
cout<<"~Derviede()"<<endl;
}
};
int main()
{
Base *bd = new Dervied; // 父类指针指向了子类对象---此时父类指针只能指向子类的subbase
// 1.new 分配内存 调用base,dervied的构造函数
/* 输出
Base()
Dervied()
~Dervied()
~Base()
*/
delete(bd);
//由于Base::~Base()是虚函数,因此子类中继承而来的Dervied::~Base()也是虚函数且在虚表之中
//同时我们知道子类构造函数会先调用基类的构造函数构造基类
//Dervied::~Base()会先析构子类(调用子类的析构函数)
}
总结:
当一个类要用来做基类时,务必将析构函数设置为虚函数,才能正确调用派生类的析构函数,防止内存泄漏。