虚函数的限制

1.static成员函数不能是虚函数

   虚函数存在于有继承关系的类的对象中,在派生类中覆盖了基类的虚函数,实现了动态绑定。通过基类的指针或引用调用派生类版本。

static成员函数在继承关系中只存在一份。是属于类的,而不受限于某个对象,不存在this指针。在派生类中的继承的static函数和基类是一个函数。因此~。

2.inline成员函数不能是虚函数

 函数的inline属性是在编译时静态确定的,而virtual则是在运行时确定的。肯定不能同时存在。

inline函数建议编译程序在调用该函数的地方将函数代码展开来插入到caller的代码中,这个只是一种指示,至于会不会被内敛,编译程序要看该函数是否存在多重循环,或复杂的函数等。

3.构造函数不能是虚函数

构造函数主要是完成对象的初始化功能,在构造函数运行的过程中对象还没有完全初始化。

而虚函数是对象的虚函数指针vptr调用vtb中的函数。如果构造函数是虚函数的话,派生类的构造函数则调用的是基类的构造函数,显然不对。

4.赋值操作符不能是虚函数

将赋值操作符定义为虚函数是无意义的。赋值操作符的参数是该类的const引用类型,所以 派生类的赋值操作符的参数是本类的const引用类型,与基类的赋值操作符是不一样的。如果赋值操作符是虚函数的话,则派生类实现的则是以基类的const引用类型,与派生类的赋值操作符是不符的。

5.析构函数通常为虚函数

在删除指向动态内存分配的指针时,需要运行析构函数在释放内存之前删除对象。在处理继承层次的指针时,指针的静态类型可能与被删除对象的动态类型不同。在删除指针时可能删除派生类的基类类型指针。要正确调用析构函数,通常将基类的析构函数定义为虚函数。

6.构造函数与析构函数中的虚函数

构造派生类对象时首先运行基类的构造函数初始化基类部分,此时派生类部分是未初始化的。

在撤销派生类对象时首先是撤销派生类部分。

构造函数与析构函数在运行过程中,对象都是不完整的。如果调用虚函数(或间接调用虚函数),则运行的是为构造函数或析构函数自身类型的版本。

 

 

转载于:https://www.cnblogs.com/fmlblog/archive/2013/06/03/3116114.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值