/*
虚析构函数
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,
沿着继承路径逐个调用基类的构造函数。
析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象。
*/
案例如下:
#include<iostream>
using namespace std;
class A
{
public:
A() {
cout << "A()..." << endl;
this->p = new char[64];
memset(this->p, 0, 64);
strcpy_s(this->p,strlen("A String..")+1, "A String..");
}
virtual void print()
{
cout << "A: " << this->p << endl;
}
virtual ~A() //加上关键字变成虚析构函数
{
cout << "~A()..." << endl;
if (this->p!=NULL)
{
delete[]this->p;
this->p = NULL;
}
}
private:
char*p;
};
class B :public A
{
public:
B() {
cout << "B()..." << endl;
this->p = new char[64];
memset(this->p, 0, 64);
strcpy_s(this->p, strlen("B String..")+1, "B String..");
}
virtual void print()
{
cout << "B: " << this->p << endl;
}
virtual ~B() {
cout << "~B()..." << endl;
if (this->p!=NULL)
{
delete[]this->p;
this->p = NULL;
}
}
private:
char*p;
};
void func(A *ap)
{
ap->print();//在此发生多态
}
void deleteFunc(A *ap) {
delete ap;
//delete ap;//此刻ap->~B()//~B()-->~A()
}
void test() {
//A *ap = new A;
//func(ap);
B *bp = new B;
func(bp);
deleteFunc(bp);
}
int main(void) {
test();
return 0;
}