【002 虚函数】什么函数不能声明为虚函数?

一、结论

虚函数必须是类的非静态成员函数(且非构造函数)。


二、不能声明为虚函数的函数

常见的不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。

1、为什么C++不支持普通函数为虚函数?

普通函数不属于成员函数,不能被继承。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数,而多态体现在运行时绑定。

2、为什么C++不支持构造函数为虚函数?

虚函数的调用需要虚函数表指针vptr,而该指针存放在对象的内存空间中,若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,也就没有虚表指针,更没有虚函数表vtable地址用来调用虚构造函数了。(执行构造函数的时候已经存在this指针,但是没有虚表指针vptr)

在 C++ 中,this 指针通常不是显式地作为构造函数的参数传递的。相反,编译器会隐式地将该对象的地址作为 this 指针传递给构造函数。

3、为什么C++不支持内联成员函数为虚函数?

内联函数:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。

原因:虚表机制需要一个真正的函数地址,而内联函数展开以后,就不是一个函数,而是一段简单的代码。

c++ 类模板函数模板的问题,模板函数不能是虚函数,虚函数不能是内联 - 大老虎打老虎 - 博客园

4、为什么C++不支持静态成员函数为虚函数?

简单来讲,静态成员函数不属于类中的任何一个对象和实例,属于类共有的一个函数,不满足继承关系。

具体来说,静态成员函数不能用this指针来访问,因为this指针指向的是每一个对象和实例。而对于virtual虚函数,它的调用恰恰使用this指针。

在有虚函数的类实例中,this指针调用虚表指针vptr,指向的是虚函数列表vtable,通过虚函数列表找到需要调用的虚函数的地址。总体来说虚函数的调用关系是:this指针->vptr(4字节)->vtable ->virtual虚函数。

static静态函数没有this指针,也就无法找到虚函数了。所以静态成员函数不能是虚函数。

静态成员函数为什么不能是虚函数_Coding_Fly_的博客-CSDN博客_静态成员函数可以是虚函数吗

5、为什么C++不支持友元函数为虚函数?

因为C++不支持友元函数的继承(子类可以自己再额外声明父类作为友元,但不会自动继承父类的友元函数),对于没有继承特性的函数没有虚函数的说法。

也就是说没有满足实现多态的三个条件中的第1点。

1.要有子类继承父类;
2.要有重写;
3.父类指针或引用指向子类对象。


三、参考内容

哪些函数可以成为虚函数,哪些函数不可以成为虚函数_u010765526的博客-CSDN博客_哪些函数不能是虚函数

静态成员函数为什么不能是虚函数_Coding_Fly_的博客-CSDN博客_静态成员函数可以是虚函数吗

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kashine

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

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

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

打赏作者

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

抵扣说明:

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

余额充值