C++之构造函数与虚析构函数

文章讨论了C++中构造函数不能被设置为虚函数的原因,包括构造函数需要知道对象的具体类型,以及构造过程的静态联编特性。同时,解释了析构函数可以是虚函数的情况,以便在基类指针删除派生类对象时能正确调用派生类的析构函数。文章强调了析构函数设为虚函数的必要性,特别是在处理动态分配的对象时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数为什么不能被设置为虚函数

1.虚函数调用只需要“部分的信息”,即只需要知道函数的接口(函数返回类型,函数名,参数列表),而不需要对象的具体类型,但是构造一个函数的时候,必须知道具体的类型信息。如果你调用一个虚构造函数,编译器不知道你要构造的继承树上的那种类型。

  • 1.构造函数的用途:创建对象,初始化对象中的属性,类型转化
  • 2.再类中定义虚函数就会有一个虚函数表(vftable),对象模型中就就含有一个指向虚表的指针(_vfptr)。在定义对象时构造函数设置虚表指针指向虚函数表
  • 3.使用指针和引用调用虚函数,在编译只需要知道函数接口,运行时指向对象,才能关联到具体对象的虚方法(通过虚函数指针查虚表得到具体对象中的虚方法)
  • 4.构造函数是类的一个特殊成员:
    1)定义对象由系统自动调用构造函数,对象自己是不可以调用构造函数;
    2)构造函数的调用属于静态联编,在编译时就必须知道具体类型的信息
  • 5.如果构造函数可以设置为虚函数,使用指针调用构造函数,如果编译器采用的静态联编,构造函数就不能为虚函数,如果编译器采用的是动态联编,运行时指针指向具体的对象,使用指针调用构造函数,相当于已经实例化的对象在调用构造函数,这是不允许调用,对象的构造函数只执行一次
  • 6.如果指针可以调用构造函数,通过虚函数表,调动构造函数,那么,当指针为nullptr,如何查虚函数表呢?
  • 7.构造函数是在编译时确定,如果是虚构造函数,编译器不知道构建的是继承树上的那种类型

析构函数为什么可以被设置为虚函数

  • 当一个对象的生命周期结束时,系统会自动调用析构函数注销该对象并进行善后工作,对象自身也可以调用析构函数
  • 析构函数的善后工作是:释放对象在生命期内获得的资源(如动态分配的内存,内核资源)
  • 析构函数也用来执行对象即将被撤销之前的操作

在什么情况下析构函数必须为虚函数

根据赋值兼容性规则,可以用基类的指针指向派生类的对象,如果使用基类指针指向动态创建的派生类的对象,由该基类指针撤销派生类对象,则必须将析构函数设置为虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

淡蓝色的经典

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

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

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

打赏作者

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

抵扣说明:

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

余额充值