C++类——构造函数、析构函数可以是虚函数么?

回答构造函数不能为虚函数,而析构函数可以且常常是虚函数。


分析

1、析构函数常常是虚函数?

下面用一个实例来解释:

class Cbase
{
public:
	Cbase(){}
	~Cbase()
	{
		cout << "Cbase :: ~Cbase" << endl;
	}
 };
class Child : public Cbase
{
public:
	Child(){}
	~Child()
	{
		cout << "Child ::~Child " << endl;
	}
};
 
int main()
{
	Cbase *pBase; 
	Child a;
	pBase = &a;
	return 0;
}
结果


从这现象就可以看出,在析构对象pBase时,先调用基类的析构函数(释放基类的资源),然后再调用派生类的析构函数,那么为什么系统知道调用基类的析构函数呢? 那么很容易就理解 了 ,是 “虚表” 惹的祸(哈哈)。那么析构函数是虚函数还有什么好处么? 我们知道虚函数时实现多态的重要机制,所以,析构函数是虚函数 是为了实现多态机制


----------------修改:2017.8.10

上面的例子,感觉不能说明这个问题,所以还是直说吧。

析构函数可以为虚函数,主要是基类指针指向子类对象的情况下,在基类销毁时,只调用基类的析构函数而不调用子类的析构函数,从而导致内存泄漏,所以需要虚函数机制来帮助系统' 识别 '需要释放资源。


2、构造函数为什么不能是虚函数?

简答解释: 虚函数采用的是虚调用的办法, 虚调用是一种可以在只知道部分信息的情况下正常工作的机制,特别是 在我们只知道接口而不知道准确的对象类型的函数 。 但是,要创建一个类对象,必须要让构造函数知道对象的准确类型,所以构造函数不能为虚!



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值