美文网首页
C++虚函数的理解

C++虚函数的理解

作者: 风轻云淡宇 | 来源:发表于2023-11-13 17:20 被阅读0次

面向对象的语言有三大特性:继承、封装、多态,虚函数是多态的一种实现方式,另外虚函数的实现又涉及到对象的内存布局,所以这里先说下什么是多态,再说下对象的内存布局,最后说虚函数具体是怎么实现的。

多态

所谓多态指相同的消息给予不同的对象会引发不同的动作。更直接地说,就是“在用父类指针调用函数时,实际调用的是指针指向的实际类型(子类)的成员函数”。多态性使得程序调用的函数是在运行时动态确定的,而不是在编译时静态确定的。

对象的内存布局

简单说下对象的内存布局:成员函数放在代码区,为该类的所有对象公有,即不管新建多少个该类的对象,所对应的都是同一个代码区的函数。而成员变量则为各个对象所私有,即每新建一个对象都会开辟一块内存区用来存储成员变量的值。在调用成员函数时,程序会根据类的类型,找到对应代码区所对应的函数并进行调用。

虚函数的具体实现

虚函数是加了virtual修饰词的类的成员函数。
那么虚函数又是怎么实现的呢?一个类如果有虚函数,这时用sizeof这个类的对象,会多出4个字节,用于存储实现虚函数的关键----虚函数表指针vptr。这个指针指向一张名为“虚函数表”(vtbl)的表,而表中的数据则为函数指针,存储了虚函数具体实现所对应的位置。注意,普通函数、虚函数、虚函数表都是同一个类的所有对象公有的,只有成员变量和虚函数表指针是每个对象私有的,sizeof的值也只包括vptr和成员所占内存的大小,并且vptr通常会在对象内存的最起始位置。另外,当类有多个虚函数时,仍然只有一个虚函数表指针vptr,而此时的虚函数表vtbl中会有多个函数指针,分别指向对应的虚函数实现区域。
总后总结下,虚函数实现的过程:通过对象内存中的vptr找到虚函数表vtbl,接着通过vtbl找到对应虚函数的实现区域并进行调用。

以上就是虚函数的实现方式。

相关文章

  • 理解C++虚函数

    title: 理解C++虚函数date: 2018-11-11 15:31:26categories:- 概念理解...

  • C++ 虚函数

    C++ 虚函数 虚函数 基类中使用virtual关键字声明的函数,称为虚函数。虚函数的实现,通过虚函数表来实现的。...

  • C++学习笔记

    C++面对对象 实函数,虚函数,纯虚函数,函数重写 虚函数:需要进行子类的重写时。virtual void 函数名...

  • pwnable.kr之uaf && c++虚函数

    c++的逆向还是要熟悉下。 一、关于c++虚函数 虚函数使得c++能够实现多态,每个类有一个虚表,每个对象在实现的...

  • (Boolan) 面向对象高级编程(下)第四周笔记

    一、虚函数表 对C++ 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)...

  • 查漏补缺

    C++虚函数: 多态: 静态多态(重载)、动态多态(虚函数) 虚函数 虚函数表:编译器为每个类创建了一个虚函数表...

  • C++中的(纯)虚函数

    简介 本章节会介绍在C++中虚函数及纯虚函数的主要作用,C++也是通过虚函数实现动态绑定,本小节不会去讲述动态绑定...

  • C++重新理解虚函数

    1. 虚函数的定义 允许派生类重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类或派生类的同名函数 1...

  • 理解 C++ 虚函数表

    引言 虚表是 C++ 中一个十分重要的概念,面向对象编程的多态性在 C++ 中的实现全靠虚表来实现。在聊虚表之前我...

  • C++ 虚函数本质

    C++ 虚函数本质

网友评论

      本文标题:C++虚函数的理解

      本文链接:https://www.haomeiwen.com/subject/naorwdtx.html