作用: 当使用基类的指针删除一个派生类的对象时,可以调用派生类的析构函数。由于有虚函数表的存在,这里就发生了多态,使得派生类的析构函数能够被调用。反之,如果基类的析构函数不是虚函数,则使用基类的指针删除派生类的对象时,不会调用派生类的析构函数。
#include<iostream>
using namespace std;
class AA
{
public:
AA()
{
cout << "AA::AA" << endl;
}
virtual ~AA()
{
cout << "AA::~AA" << endl;
}
};
class BB : public AA
{
public:
BB()
{
cout << "BB::BB" << endl;
}
~BB()
{
cout << "BB::~BB" << endl;
}
};
class CC : public BB
{
public:
CC()
{
cout << "CC::CC" << endl;
}
~CC()
{
cout << "CC::~CC" << endl;
}
};
class DD : public CC
{
public:
DD()
{
cout << "DD::DD" << endl;
}
~DD()
{
cout << "DD::~DD" << endl;
}
};
int main()
{
AA* p = new DD;
delete p;
p = 0;
system("pause");
return 0;
}
#include<iostream>
using namespace std;
class CFather
{
public:
CFather()
{
cout << "CFather::CFather" << endl;
}
virtual ~CFather() // 虚析构 通过父类指针删除一个子类对象
{
cout << "CFather::~CFather" << endl;
}
};
class CSon : public CFather
{
public:
CSon()
{
cout << "CSon::CSon" << endl;
}
~CSon()
{
cout << "CSon::~CSon" << endl;
}
};
int main()
{
{
CFather * pSon = new CSon;
delete pSon; //pSon->~CFather()
pSon = 0;
}
system("pause");
return 0;
}