虚函数产生的条件

能否成为虚函数主要有以下两种判断依据,如果以下两种条件均满足,则具有成为虚函数的条件。

  • 1、虚函数机制为动多态提供支持,而虚函数表中存放着虚函数的地址。因此虚函数必须是可以取地址的函数。

  • 2、虚函数的调用是依靠(对象的)虚表指针解引用得到虚表,再从虚表中找到对应的虚函数入口地址。换言之,虚函数依赖对象调用

在C++的类中主要存在以下几种函数:

1. 构造函数

构造函数不能依赖对象调用 。对象产生的步骤主要有二:1、开辟内存空间,2、调用构造。这两部操作完成之后才会有对象生成。因此,不能成为虚函数。

2.析构函数

析构函数调用前,对象完整,与既有的逻辑不冲突,理论上可以手动调用析构函数。事实上也的确如此,形如 Obj.~Test() (在Test类中)的调用方法。可以成为虚函数。

3.内联函数

由inline 关键字修饰的函数,内联函数在函数的调用点直接展开,因此内联函数不可以取地址 ,不能成为虚函数。

4.static修饰的函数

static修饰的函数使用 __cdecl 调用约定(类成员方法使用 __thiscall 约定),而此类函数不依赖对象调用 ,因此,不能成为虚函数。

5.全局函数

毫无疑问,全局函数不依赖对象调用 。与类没有关系,不可能被写入类的虚表。不能成为虚函数。

6.类成员方法

显然类成员方法可以成为虚函数。


附:

虚函数初探: https://blog.csdn.net/weixin_43919932/article/details/104157463

动多态的发生时机: https://blog.csdn.net/weixin_43919932/article/details/104389342

最新文章

  1. php中引用&的真正理解-变量引用、函数引用、对象引用
  2. Swift学习之熟悉控件
  3. Linux(二)__文件目录、常用命令
  4. Javaweb Servlet出现Class xxx is not a servlet错误原因
  5. redhat centos yum源的安装
  6. [php] 处理图像
  7. Java多线程-新特征-阻塞队列ArrayBlockingQueue
  8. Javascript 中 call 的两种用法
  9. 【转】eclipse插件:OpenExplorer快速打开文件目录
  10. ssh公私钥登录方式设置
  11. mysql建表---级联删除
  12. vue单文件组件的构建
  13. 关于html中利用jQuery选择子节点方法总结——待续
  14. Redis基础学习(四)—Redis的持久化
  15. 暑假集训D10总结
  16. gitlab-ci-runner安装
  17. [转]Windows下配置Node.js和Cordova
  18. LogUtil工具
  19. nginx gzip on 无效
  20. 如何在.Net Core MVC中为动态表单开启客户端验证

热门文章

  1. 如何使用 VS Code 远程连接矩池云主机
  2. redirect route 路由传参
  3. json web token JWT实现TP5创建和验证
  4. php将一个字符串转变成键值对数组的效率问题
  5. 2021-08-02(console、comfrim)
  6. GO语言基础(结构+语法+类型+变量)
  7. ArcMap操作随记(7)
  8. 040_Eureka 服务注册与发现
  9. docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
  10. SQL语句性能优化策略