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