在构造函数中使用虚函数可以实现多态吗?

在构造函数和析构函数中使用虚函数可以实现多态吗?

不能

因为不管是构造函数还是析构函数,其父类和子类的执行都是有一定顺序的,拿构造函数来说,父类的构造函数会先生成(一个很简单的道理,父类再被子类继承后,其已然属于子类的一部分,所以得先构造父类的那部分,才会构造子类的那部分,归结到虚函数指针上来就是,vptr会先指向父类的虚函数,当父类构造完成后,再指向子类的虚函数),因此,在构造父类的时候执行到父类构造函数中的虚函数时,子类还没构造呢,也就无法动态绑定到子类那,只会执行父类自己的虚函数,也就无法实现多态。析构函数中也是如此,子类的析构会先于父类执行(这点可以这么想,子类继承了父类,父类是子类中不可缺少的一部分,如果先解决了父类,那子类也就不完整了,所以正确的解决顺序应当是先子类析构再父类析构),在执行到父类的析构函数时,子类已经被析构完成了,其析构函数中定义的虚函数自然也就无法下降到(我一直觉得下降到这个词语用的很精妙)子类去执行,也就无法实现动态绑定,实现多态。

这是有继承关系下的构造函数和析构函数的调用顺序,并且,析构应当是虚析构,借着上面这个问题,可以引出第二个问题。

为什么要使用虚析构函数?

这个问题是有一个产生背景的,当使用一个父类指针去指向一个子类对象的时候,如果父类的析构函数不是虚函数,那么很有可能会造成内存泄漏(如果子类使用new开辟了空间)

因为,一个父类指针去指向一个子类对象,其执行的权限是父类权限,也就是说在析构的时候,其调用的是父类的析构,此时如果父类的析构函数不是一个虚函数,那么他就无法下降到子类去执行子类的析构函数,倘若子类申请了空间,那这片空间就无法得到释放,就会造成内存泄漏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值