虚析构函数

虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。

举例A* d = new B();(假定A是基B是从A承而来的派生),那(A)析构函数必是虚的,否delete dB的析构函数将不会被用,因而会生内存泄漏和异常;

class Base
{
public:
   Base(){}
   virtual ~Base(){}
};

class Derived: public Base
{
public:
   Derived(){};
   ~Derived(){};
}

void foo()
{
   Base *pb;
   pb = new Derived;
   delete pb;
} 
会发生动态绑定,它会先调用Derived的析构函数,然后是Base的析构函数。

如果不加virtual,delete pb只会执行Base的析构函数,而不是真正的Derived析构函数。

再看一个例子:

class A{
public:
	int a;
	A(){cout<<"A"<<endl;}
	~A(){cout<<"~A"<<endl;}
};

class B{
public:
	A* pA;
	B(){pA= new A;cout<<"B"<<endl;	}
	virtual ~B(){delete pA;cout<<"~B"<<endl;}
	//没有virtual时,不会调用C中析构
	//有virtual时,会调用C中析构
};

class C:public B{
public:
	C():B(){cout<<"C"<<endl;}
	~C(){cout<<"~C"<<endl;}
};

int main(){
	B *pB = new C;
	delete pB;
	return 0;
}


结果:有virtual时,A B C ~C ~A ~B

           没有virtual时,A B C ~A ~B


参考:1.http://blog.csdn.net/Eric_Jo/article/details/4161480

   2.http://www.cnblogs.com/chio/archive/2007/09/10/888260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值