C++ | 虚函数产生条件

虚函数产生的条件

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

  • 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

原文地址:https://www.cnblogs.com/TaoR320/p/12680128.html