虚函数产生的条件

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

  • 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

C++ | 虚函数产生条件的更多相关文章

  1. C++虚方法(虚函数)随笔

    本文不讨论虚函数的原理,只简单总结下虚函数的常用事项. 虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(voi ...

  2. c++ 继承 虚函数与多态性 重载 覆盖 隐藏

    http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...

  3. c++学习-虚函数

    #include <iostream> using namespace std; class common{ public: virtual void hello(){cout<&l ...

  4. [C++]虚函数-同名访问

    首先来看一下派生类和基类成员同名事的处理规则: 派生类内定义了一个与基类同名的成员,该现象称为同名覆盖,此时,无论派生类内部成员函数还是派生类的对象访问同名成员,如果未加任何特殊标识,则访问派生类中重 ...

  5. C++中的重载,隐藏,覆盖,虚函数,多态浅析

    直到今日,才发现自己对重载的认识长时间以来都是错误的.幸亏现在得以纠正,真的是恐怖万分,雷人至极.一直以来,我认为重载可以发生在基类和派生类之间,例如: class A { public: void ...

  6. TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)

    前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...

  7. C++中的动态类型与动态绑定、虚函数、运行时多态的实现

    动态类型与静态类型 静态类型 是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型.静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变.通俗的讲,就是上下文无关,在编译时 ...

  8. C++中虚函数功能的实现机制

    要理解C++中虚函数是如何工作的,需要回答四个问题. 1.  什么是虚函数. 虚函数由于必须是在类中声明的函数,因此又称为虚方法.所有以virtual修饰符开始的成员函数都成为虚方法.此时注意是vir ...

  9. c++ virturn function -- 虚函数

    c++ virturn function -- 虚函数 pure irtual function  -- 纯虚函数   先看例子 #include <iostream> using nam ...

随机推荐

  1. Linux中查看进程与日志

    转至:https://www.cnblogs.com/dengxiaoning/p/13336778.html Linux尽管使用频繁,仍然每次都还是需要到处去找相关的命令,如进程,日志之类的,既然这 ...

  2. 【用户状态】详细解读Oracle用户ACCOUNT_STATUS的九种状态

    转至:http://blog.itpub.net/519536/viewspace-672276/ DBA_USERS视图中ACCOUNT_STATUS记录的用户的当前状态,一般情况下在使用的正常用户 ...

  3. centos7 配置 zabbix 3 & apache , nginx 与php, mysql 的交互(基本)

    #yum install -y https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-server-mysql-3.0.0 ...

  4. PostgreSQL 的字段类型和表操作笔记

    字段类型 数值类型 Name Storage Size Description Range smallint 2 bytes small-range integer -32768 to +32767 ...

  5. iOS桌面小插件 Widget Extension

    iOS桌面小插件 Widget Extension 这个插件时iOS14以后才出现的,基于SwiftUI 旧项目新建时可能一堆错误,其中一个时要把插件target 开发sdk版本设置为14.0以上 新 ...

  6. Qt:QSqlQuery

    0.说明 QSqlQuery提供了执行SQL代码的方法. QSqlQuery封装了在QSqlDatabase中查询.检索数据的相关函数.它可以用来执行如SELECT.INSERT.UPDATE.DEL ...

  7. c# 窗体相关操作(最大化/最小化/关闭/标题栏)

    /// <summary> /// 窗体跟随鼠标移动的标记 /// </summary> private bool normalmoving = false; /// < ...

  8. LOTO示波器汽修专用款选型指南

    LOTO示波器汽修专用款选型指南 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测.汽修应用中,工程师对示波器的性能要求对于LOTO产品来说不算高. 在我们销售和技术支持的积累过程中,我 ...

  9. nginx 如何访问php文件

    1.进入nginx安装路径,我的是/usr/local/nginxvi conf/nginx.conf将 location ~ \.php$ { root html; fastcgi_pass 127 ...

  10. S2-048(RCE远程代码执行)

    环境搭建: https://blog.csdn.net/qq_36374896/article/details/84145020 进入漏洞环境 cd vulhub-master/struts2/s2- ...