构造函数与析构函数是否能为虚函数

一、析构函数可以是虚析构函数

假如基类的析构函数不可以是虚函数,那么用基类指针或者引用指向派生类型时,就只会调用基类的析构函数,一直调用不到的是派生类对象的析构函数,导致内存泄漏。所以,将析构函数声明为虚函数是十分有必要的。

二、构造函数不能为虚函数

1、从存储空间角度

虚函数的执行依赖于虚函数表,而虚函数表是在构造函数中初始化的,即初始化虚表指针(vptr),让它指向虚函数表。可是虚表指针是存储在对象的内存空间的,它是一个对外不可见的类成员变量*__vptr。如果构造函数是虚函数,就需要通过虚表指针来调用,而对象还没有实例化,内存空间都还没有分配,该成员变量也无法初始化,这就无法找到虚函数表,所以构造函数不能是虚函数。

2、从使用角度

虚函数的作用是在程序运行时,是通过父类的指针或者引用来调用子类的那个成员函数,而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用。假设我们是要创建该对象,难道要先实例化一个父类对象,再去调用所谓的这个虚构造函数?逻辑不合理,创建对象应该直接调用该对象的构造函数即可,所以构造函数不能,也不该是虚函数。

参考:

为什么构造函数不能为虚函数_GeekFans的博客-CSDN博客_构造函数为什么不能是虚函数

C++中为什么构造函数不能定义为虚函数_史立坤的博客-CSDN博客_构造函数为什么不能是虚函数

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值