C++ | 虚函数产生条件
2024-09-07 23:43:59
虚函数产生的条件
能否成为虚函数主要有以下两种判断依据,如果以下两种条件均满足,则具有成为虚函数的条件。
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
最新文章
- php中引用&;的真正理解-变量引用、函数引用、对象引用
- Swift学习之熟悉控件
- Linux(二)__文件目录、常用命令
- Javaweb Servlet出现Class xxx is not a servlet错误原因
- redhat centos yum源的安装
- [php] 处理图像
- Java多线程-新特征-阻塞队列ArrayBlockingQueue
- Javascript 中 call 的两种用法
- 【转】eclipse插件:OpenExplorer快速打开文件目录
- ssh公私钥登录方式设置
- mysql建表---级联删除
- vue单文件组件的构建
- 关于html中利用jQuery选择子节点方法总结——待续
- Redis基础学习(四)—Redis的持久化
- 暑假集训D10总结
- gitlab-ci-runner安装
- [转]Windows下配置Node.js和Cordova
- LogUtil工具
- nginx gzip on 无效
- 如何在.Net Core MVC中为动态表单开启客户端验证
热门文章
- 如何使用 VS Code 远程连接矩池云主机
- redirect route 路由传参
- json web token JWT实现TP5创建和验证
- php将一个字符串转变成键值对数组的效率问题
- 2021-08-02(console、comfrim)
- GO语言基础(结构+语法+类型+变量)
- ArcMap操作随记(7)
- 040_Eureka 服务注册与发现
- docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
- SQL语句性能优化策略