【可乐教育】C++ 虚函数表(可乐学堂)

【可乐教育】C++ 虚函数表(可乐学堂)

C++ 内存分为 5 个区域:

  • 堆 heap :由 new 分配的内存块,其释放编译器不去管,由程序员自己控制。如果程序员没有释放掉,在程序结束时系统会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露”。栈 stack :是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。全局/静态存储区 (.bss段和.data段) :全局和静态变量被分配到同一块内存中。在 C 语言中,未初始化的放在.bss段中,初始化的放在.data段中;在 C++ 里则不区分了。常量存储区 (.rodata段) :存放常量,不允许修改(通过非正当手段也可以修改)。代码区 (.text段) :存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。

注意:静态局部变量也存储在全局/静态存储区,作用域为定义它的函数或语句块,生命周期与程序一致。

其中对象数据中存储非静态成员变量、虚函数表指针以及虚基类表指针(如果继承多个)。这里就有一个问题,既然对象里不存储类的成员函数的指针,那类的对象是怎么调用公用函数代码的呢?对象对公用函数代码的调用是在编译阶段就已经决定了的,例如有类对象a,成员函数为show(),如果有代码a.show(),那么在编译阶段会解释为 类名::show(&a)。会给show()传一个对象的指针,即this指针。

从上面的this指针可以说明一个问题:静态成员函数和非静态成员函数都是在类的定义时放在内存的代码区的,但是类为什么只能直接调用静态成员函数,而非静态成员函数(即使函数没有参数)只有类对象能够调用的问题?原因是类的非静态成员函数其实都内含了一个指向类对象的指针型参数(即this指针),因而只有类对象才能调用(此时this指针有实值)。

虚函数表

C++中虚函数是通过一张虚函数表(Virtual Table)来实现的,在这个表中,主要是一个类的虚函数表的地址表;这张表解决了继承、覆盖的问题。在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以当我们用父类的指针来操作一个子类的时候,这张虚函数表就像一张地图一样指明了实际所应该调用的函数。

C++编译器是保证虚函数表的指针存在于对象实例中最前面的位置(是为了保证取到虚函数表的最高的性能),这样我们就能通过已经实例化的对象的地址得到这张虚函数表,再遍历其中的函数指针,并调用相应的函数。

特别声明:[【可乐教育】C++ 虚函数表(可乐学堂)] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

输送100℃热水该用什么泵(输送热水管道材料)

适用的泵类型高温热水循环泵这种泵专门针对高温液体输送设计,其材料通常选用耐高温的合金,密封结构也经过特殊处理,能够在100℃甚至更高温度下稳定工作。在学校的热水供应系统中,其不锈钢保温水箱可以有效保持热水温…

输送100℃热水该用什么泵(输送热水管道材料)

姚冠宇主演的4部短剧,每一部都是经典,哪部是你熬夜追的?(姚冠宇主演的短剧)

在各种场合,她凭借季翰诚的助力,让继母和继妹阴谋落空。这对的颜,更是磕晕我,漂亮的惊人,姚冠宇身上有股子奇异的气质,他甚至不用脸和身高,靠有特色的单眼皮和演技就能杀出来一条血路。欢迎在下面的评论框和大家一起分…

姚冠宇主演的4部短剧,每一部都是经典,哪部是你熬夜追的?(姚冠宇主演的短剧)

郭麒麟:14岁被逼辍学与亲爸闹掰,家宴没他座,还要当“替罪羊”(郭麒麟十四岁退学原因)

它深刻地塑造了他的性格和人生观,让他更加珍惜每一次成长的机会,也让他学会了在逆境中寻找突破。 虽然郭麒麟与生父郭德纲的关系一度疏远,但于谦的存在让他明白了什么是真正的关爱和支持。这个决定无疑是对父亲和德云社的…

郭麒麟:14岁被逼辍学与亲爸闹掰,家宴没他座,还要当“替罪羊”(郭麒麟十四岁退学原因)

李明德被判有期徒刑6个月,锦月如歌怕不是真的要换脸了?(李明德被判有案底吗)

在7月31日,编剧兼导演杨洋在微博上发布了一则重要消息,他称:“经过半年波折,这件事终于有了结果,向大家交代一下,也算是结束。”实际上,他作为演员还有几部作品正在制作中,尤其是在《锦月如歌》中,他饰演的角色十…

李明德被判有期徒刑6个月,锦月如歌怕不是真的要换脸了?(李明德被判有案底吗)

Mercury:2025年访问控制器趋势报告-现代挑战如何影响技术创新(mercury systems)

今天分享的报告是《2025年访问控制器趋势报告-现代挑战如何影响技术创新》,版权归Mercury所有。 随着网络安全、边缘计算和物联网技术的进步,访问控制器变得越来越安全、越来越智能、功能也越来越多样。本报告…

Mercury:2025年访问控制器趋势报告-现代挑战如何影响技术创新(mercury systems)