什么函数不能声明为虚函数

共有五种函数不能声明为虚函数,即普通函数(非成员函数)、构造函数、内联函数、静态函数、友元函数。

首先说明两点:

(1)虚函数是为了实现多态,而多态是属于动态联编,在运行时确定调用哪个函数。

(2)虚函数调用时,类之间需要有公有继承 +继承关系 + 基类指针或引用调用

(1)普通函数为啥不能是虚函数?

原因:多态是依托于类的,要声明的多态的函数前提必须是虚函数。

(2)构造函数为啥不能是虚函数?

原因:多态是依托于类的,多态的使用必须是在类创建以后,而构造函数是用来创建构造函数的,所以不行。

具体的原因:虚表指针的初始化时在构造函数进行的,而虚函数需要放到虚表中。在调用虚函数前,必须首先知道虚表指针,此时矛盾就出来了。

(3)内联函数为啥不能是虚函数?

原因:内联函数属于静态联编,即内联函数是在编译期间直接展开,可以减少函数调用的花销,即是编译阶段就确定调用哪个函数了。但是虚函数是属于动态联编,即是在运行时才确定调用哪一个函数。显然这两个是冲突的。

(4)静态函数为啥不能使虚函数?

原因:

<1>从技术层面上说,静态函数的调用不需要传递this指针。但是虚函数的调用需要this指针,来找到虚函数表。相互矛盾

<2>从存在的意义上说,静态函数的存在时为了让所有类共享。可以在对象产生之前执行一些操作。与虚函数的作用不是一路的。

(5)友元函数为啥不能是虚函数?

原因:C++不支持友元函数的继承,不能继承的函数指定不是虚函数
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值