虚函数的实现

2024/08/04 cplusplus 共 847 字,约 3 分钟

#1. 虚函数的引入 虚函数在cpp的中,主要的作用就是实现了多态。所谓多态,其表现形式就是父类的指针指向子类的对象。它的实现就是父类来定义一个虚函数,子类可以重写这个虚函数。

#2. 虚函数的实现

虚函数的调用过程

1.通过对象内存中的虚函数指针找到虚表

2.通过虚表找到虚函数的实现来进行调用

虚表的底层实现是函数指针数组,归属于类,数组中的每一元素对应一个函数指针指向该类的一个。

虚函数指针归属于对象,一个对象一个虚函数指针。

·非重写情况下,子类的虚表中先放父类虚函数,再放自己的虚函数指针,指针指向父类虚表

·重写情况下,子类的虚表对应位置上的虚函数地址会被覆盖。

注意虚函数无论多少个都只需要在对象中添加一个虚函数表的地址。

调用虚函数时,程序将查看存储在对象中的虚函数表地址,转向相应的虚函数表,使用类声明中定义的第几个虚函数,程序就使用数组的第几个函数地址,并执行该函数

##2.1 使用虚函数后产生的变化 1)对象的空间会增加一个存储地址 2)每个类都会产生一张虚函数表 3)每次调用时,都会去在虚表中查找地址

#3. 虚函数注意事项

1) “一虚都虚”,父类声明虚函数后,子类和其子类中,该函数都是虚的 2)在使用父类指针指向子类对象时,将根据子类的对象类型来调用虚函数 3)构造函数不能是虚函数。因为虚函数的主要特性是支持动态绑定,首先需要完整的对象结构,而在构造函数执行期间,父类部分的构造还未完成,因此相关的虚表信息尚不可用。 4)析构函数必须是虚函数。当父类的析构函数为非虚函数时,删除一个父类指针指向的子类实例时,只清理了子类从基类继承过来的资源,而子类自己独有的资源却没有被清理。

#4. 函数隐藏 概念:是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

·如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字,此时基类的函数才被隐藏。 ·如果派生类的函数与基类的函数同名,但是参数不同,则不论有无 virtual 关键字, 基类的函数都将被隐藏。

需要注意的是,函数隐藏也适用于成员变量。

文档信息

Search

    Table of Contents