[每天一道面试题 c++] Day10 为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 构造函数可以是虚函数吗?

本文探讨了C++中析构函数为何必须是虚函数,以确保正确销毁子类对象并防止内存泄漏。同时,解释了C++默认不将析构函数设为虚函数的原因,是为了避免不必要的内存开销。此外,还澄清了构造函数不能是虚函数的事实,因为构造过程需要在对象类型确定前完成,而虚函数依赖于对象的实际类型。
摘要由CSDN通过智能技术生成

Day-10

问题

为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 构造函数可以是虚函数吗?

参考答案

为什么析构函数必须是虚函数?

将被继承的父类的析构函数设置为虚函数后,可以保证在new申请一个子类对象,并使用基类指针指向该对象,当释放该基类指针时可以保证子类的析构函数被执行,从而释放子类的空间,避免内存泄露。

为什么C++默认的析构函数不是虚函数?

因为虚函数需要额外的虚函数表和虚表指针,需要占用额外的内存,只有当作为父类时才会将析构函数设置为虚函数,这样可以避免不必要的内存浪费。

构造函数可以是虚函数吗?

参考:

  1. 构造函数为什么不能是虚函数
  2. C++ 构造函数和析构函数可以是虚函数嘛?

构造函数不能是虚函数,这里摘取构造函数为什么不能是虚函数中的回答:

构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。

虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。

进阶:C++对象模型

参考:图说C++对象模型:对象内存布局详解

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值