首页技术文章正文

虚函数的作用和实现原理介绍

更新时间:2020-11-20 来源:黑马程序员 浏览量:

C++的多态分为静态多态(编译时多态)和动态多态(运行时多态)两大类。静态多态通过重载、模板来实现;动态多态就是通过本文的主角虚函数来体现的。

1605868410743_虚函数的作用和实现原理.png


虚函数实现原理:包括虚函数表、虚函数指针等。

虚函数的作用说白了就是:当调用一个虚函数时,被执行的代码必须和调用函数的对象的动态类型相一致。编译器需要做的就是如何高效的实现提供这种特性。不同编译器实现细节也不相同。大多数编译器通过vtbl(virtual table)和vptr(virtual table pointer)来实现的。 当一个类声明了虚函数或者继承了虚函数,这个类就会有自己的vtbl。vtbl实际上就是一个函数指针数组,有的编译器用的是链表,不过方法都是差不多。vtbl数组中的每一个元素对应一个函数指针指向该类的一个虚函数,同时该类的每一个对象都会包含一个vptr,vptr指向该vtbl的地址。

每个声明了虚函数或者继承了虚函数的类,都会有一个自己的vtbl。

同时该类的每个对象都会包含一个vptr去指向该vtbl。

虚函数按照其声明顺序放于vtbl表中, vtbl数组中的每一个元素对应一个函数指针指向该类的虚函数。

如果子类覆盖了父类的虚函数,将被放到了虚表中原来父类虚函数的位置。

在多继承的情况下,每个父类都有自己的虚表。子类的成员函数被放到了第一个父类的表中。


猜你喜欢:

C语言指针变量类型和大小

c语言指针详解:什么是指针? 

C++多维数组的定义和用法

C++培训课程

在线咨询 我要报名
和我们在线交谈!