多继承中虚函数表如何排列?99%的开发者都理解错了!

第一章:多继承中虚函数表的复杂性与常见误解

在C++的多继承场景下,虚函数表(vtable)的布局远比单继承复杂。当一个派生类继承多个含有虚函数的基类时,编译器需要为每个基类子对象维护独立的虚函数表指针(vptr),导致对象内存布局中出现多个vptr,从而引发对对象大小、类型转换和虚函数调用机制的误解。

多继承下的虚函数表结构

考虑以下代码示例,展示两个基类和一个多重继承的派生类:

class Base1 {
public:
    virtual void func1() { }
    virtual void func2() { }
};

class Base2 {
public:
    virtual void func3() { }
};

class Derived : public Base1, public Base2 {
public:
    void func1() override { } // 覆盖 Base1 的 func1
    void func3() override { } // 覆盖 Base2 的 func3
};
在此情况下,Derived 对象内部通常包含两个虚函数表指针:一个指向 Base1 的vtable,另一个指向 Base2 的vtable。这种设计使得通过不同基类指针调用虚函数时能正确解析到目标函数。

常见误解与陷阱

  • 误认为所有基类共享同一个虚函数表 — 实际上每个基类子对象拥有独立的vptr
  • 忽略类型转换时的指针偏移 — 从 Derived* 转为 Base2* 需要调整地址以跳过 Base1 子对象
  • 误判对象大小 — 多个vptr会增加对象体积,尤其在虚拟继承中更为显著
基类vptr 数量说明
Base11标准虚函数表
Base21独立虚函数表
Derived2分别继承自 Base1 和 Base2 的 vptr
graph TD A[Derived Object] --> B[Base1 Subobject] A --> C[Base2 Subobject] B --> D[vptr → Base1 vtable] C --> E[vptr → Base2 vtable]

第二章:多继承下虚函数表的基础原理

2.1 单继承与多继承虚函数表对比分析

在C++对象模型中,虚函数表(vtable)是实现动态多态的核心机制。单继承下,派生类共享基类的vtable结构,仅在末尾追加新虚函数,布局简洁高效。
单继承vtable结构
class Base {
public:
    virtual void func1() {}
    virtual void func2() {}
};
class Derived : public Base {
public:
    void func1() override {}
    virtual void func3() {}
};
Derived的vtable包含func1(重写)、func2(继承)、func3(新增),顺序与声明一致,偏移固定。
多继承vtable复杂性
多继承引入多个vtable指针,每个基类子对象拥有独立虚表。派生类对象内存中嵌入多个子对象,导致vtable分散管理。
继承类型vtable数量对象大小(示例)
单继承18字节(含vptr)
多继承≥216字节或更多
多继承显著增加内存开销与调用成本,需谨慎设计接口继承关系。

2.2 虚函数表在多个基类中的分布规律

当一个派生类继承多个含有虚函数的基类时,编译器会为每个基类子对象生成独立的虚函数表指针(vptr),分别指向对应的虚函数表。
内存布局特点
派生类对象中,各基类子对象的vptr按继承顺序排列,每个vptr位于对应子对象的起始位置。
代码示例与分析

class Base1 {
public:
    virtual void func1() { cout << "Base1::func1" << endl; }
};
class Base2 {
public:
    virtual void func2() { cout << "Base2::func2" << endl; }
};
class Derived : public Base1, public Base2 {
public:
    void func1() override { cout << "Derived::func1" << endl; }
    void func2() override { cout << "Derived::func2" << endl; }
};
上述代码中,Derived对象包含两个vptr:第一个指向Base1的虚表,第二个指向Base2的虚表。调用虚函数时,根据静态类型确定使用哪个vptr进行分发。
  • 多重继承下虚表独立分布,避免冲突
  • vptr数量等于含虚函数的基类数量
  • 虚函数调用通过对应基类的vptr解析

2.3 派生类重写不同基类虚函数的行为解析

在C++多态机制中,派生类可选择性重写基类的虚函数。当多个基类定义了同名虚函数时,派生类的重写行为将直接影响动态绑定的结果。
虚函数表的覆盖机制
派生类会为每个继承的虚函数生成对应的虚表项,若重写则指向新实现,否则沿用基类指针。

class Base {
public:
    virtual void func() { cout << "Base::func" << endl; }
};
class Derived : public Base {
public:
    void func() override { cout << "Derived::func" << endl; } // 覆盖基类虚函数
};
上述代码中,Derived 重写 func() 后,通过基类指针调用将触发多态,输出 "Derived::func"。
多重继承中的虚函数分辨
当派生类继承多个含有同名虚函数的基类时,需明确指定重写目标或使用作用域符区分调用路径。
  • 重写一个基类函数不会自动重写其他基类的同名函数
  • 未重写的虚函数仍保留各自基类的原始实现

2.4 内存布局中的虚函数指针定位实践

在C++对象的内存布局中,虚函数表指针(vptr)通常位于对象内存的起始位置。通过分析该指针,可深入理解多态机制的底层实现。
虚函数指针的内存偏移
对于含有虚函数的类,编译器会自动插入一个指向虚函数表的指针。该指针一般占据对象前4或8字节(取决于平台位数),紧随其后的是成员变量。

class Base {
public:
    virtual void func() { }
private:
    int data;
};
// sizeof(Base) >= 8 (vptr) + 4 (int)
上述代码中,Base 类实例的前8字节存储 vptr,可通过指针强制转换访问: void** vtable = *(void***) &obj; 获取虚表首地址。
多继承下的vptr分布
在多继承场景中,对象可能包含多个vptr,分别对应不同基类子对象。此时,各vptr按继承顺序依次排列,确保动态调用时能正确跳转。
内存偏移内容
0x00vptr to Base1
0x08vptr to Base2
0x10data members

2.5 虚函数调用路径的跟踪与验证方法

在C++对象模型中,虚函数的调用依赖于虚函数表(vtable)和虚指针(vptr)。通过分析对象内存布局,可追踪虚函数的实际调用路径。
使用GDB调试器跟踪vtable
可通过GDB查看对象的虚指针指向的vtable内容:

class Base {
public:
    virtual void func() { cout << "Base::func" << endl; }
};
class Derived : public Base {
    void func() override { cout << "Derived::func" << endl; }
};
编译后在GDB中打印(Base*)derived_obj的vptr,可观察到其指向Derived类的vtable,验证动态绑定。
调用路径验证方法对比
方法适用场景精度
静态分析编译期检查中
GDB调试运行时观察高
AddressSanitizer越界检测高

第三章:对象内存模型与虚表指针布局

3.1 多继承对象的内存排布实测

内存布局观测方法
通过 C++ 的 offsetof 宏和指针偏移技术,可以精确测量多继承下子对象在内存中的分布。使用虚基类时,编译器会引入虚基类指针(vbptr),影响整体布局。
测试代码与结果分析

class A { public: int a; };
class B : public A { public: int b; };
class C : public A { public: int c; };
class D : public B, public C { public: int d; };
上述继承结构中,D 对象包含两个 A 子对象实例。使用 sizeof(D) 测得大小为 24 字节:每个分支的 A::a、B::b、C::c 和 D::d 各占 4 字节,中间存在内存对齐填充。
偏移地址成员
0B::A::a
4B::b
8C::A::a
12C::c
16D::d

3.2 各基类子对象中虚表指针的位置关系

在多重继承结构中,派生类会包含多个基类的子对象,每个带有虚函数的基类子对象都会拥有独立的虚表指针(vptr)。这些虚表指针通常位于各自子对象的起始地址处。
虚表指针布局示例

class Base1 {
public:
    virtual void func1() { cout << "Base1::func1" << endl; }
};
class Base2 {
public:
    virtual void func2() { cout << "Base2::func2" << endl; }
};
class Derived : public Base1, public Base2 {};

// 内存布局示意:
// Derived 对象:
// [Base1 subobject: vptr1][Base2 subobject: vptr2][Derived data]
上述代码中,Derived 对象内存首先包含 Base1 子对象,其首部为指向 Base1 虚表的 vptr1;紧接着是 Base2 子对象,其起始位置为 vptr2。这种布局确保通过任意基类指针均可正确调用虚函数。
虚表指针分布规律
  • 每个带虚函数的基类在派生类中都有独立的虚表指针
  • vptr 布局顺序与继承声明顺序一致
  • 类型转换时,指针值可能调整以对齐对应子对象起始地址

3.3 类型转换时的隐式虚表切换机制

在多态类型转换过程中,编译器会自动管理虚函数表(vtable)指针的切换,以确保调用正确的虚函数实现。
虚表切换的触发场景
当派生类对象被向上转型为基类指针或引用时,虚表指针自动指向基类的虚表;反之,在向下转型中若涉及多重继承,可能需要调整指针偏移并切换至对应的子对象虚表。

class Base {
public:
    virtual void foo() { cout << "Base::foo" << endl; }
};
class Derived : public Base {
public:
    void foo() override { cout << "Derived::foo" << endl; }
};

Derived d;
Base* b = &d;  // 隐式切换虚表指针
b->foo();      // 输出: Derived::foo
上述代码中,b 指向 Derived 对象,其 vptr 指向 Derived 的虚表,从而实现动态绑定。
多重继承中的复杂性
在多重继承下,不同基类子对象的虚表位置可能不同,类型转换需调整 this 指针并更新虚表指针。

第四章:典型场景下的虚函数表行为剖析

4.1 非虚继承下多重继承的虚表排列实验

在非虚继承的多重继承场景中,派生类会依次继承各个基类的虚函数表布局。通过实验可观察到,虚表指针(vptr)按继承顺序排列,每个基类部分保留独立的虚表入口。
实验代码示例

class BaseA {
public:
    virtual void funcA() {}
};
class BaseB {
public:
    virtual void funcB() {}
};
class Derived : public BaseA, public BaseB {};
上述代码中,`Derived` 类对象内存布局首先包含 `BaseA` 的虚表指针,随后是 `BaseB` 的虚表指针。两个基类的虚函数互不覆盖,各自维护独立虚表。
虚表结构分析
  • 第一个基类(BaseA)的虚表与单继承一致,位于对象起始地址;
  • 第二个基类(BaseB)的虚表通过偏移接入,其 vptr 位于对象内存中段;
  • 虚函数调用通过 this 指针调整实现正确分发。

4.2 函数名冲突与虚函数覆盖的底层实现

在C++多继承和虚函数机制中,函数名冲突与覆盖依赖于虚函数表(vtable)实现。每个对象包含指向vtable的指针,vtable中存储虚函数的实际地址。
虚函数表结构示例
class Base {
public:
    virtual void func() { cout << "Base::func" << endl; }
};
class Derived : public Base {
public:
    void func() override { cout << "Derived::func" << endl; } // 覆盖基类函数
};
上述代码中,Derived对象的vtable将func指向其自身实现,实现动态绑定。
多继承中的名称解析
  • 当多个基类具有同名虚函数,派生类需显式指定覆盖目标;
  • 编译器通过调整this指针和vtable索引解决地址偏移问题。

4.3 菱形继承结构中虚函数表的实际表现

在C++多重继承场景下,菱形继承结构会引发虚函数表的复杂布局。当两个派生类共同继承一个基类,而最终类又同时继承这两个派生类时,虚函数表将通过虚基类指针实现共享基类的唯一实例。
虚函数表布局示例

class Base {
public:
    virtual void func() { cout << "Base::func" << endl; }
};
class Derived1 : virtual public Base {
    virtual void func() { cout << "Derived1::func" << endl; }
};
class Derived2 : virtual public Base {
    virtual void func() { cout << "Derived2::func" << endl; }
};
class Final : public Derived1, public Derived2 {};
上述代码中,Final 类仅保留一份 Base 子对象,其虚函数表通过虚基类指针定位,避免冗余。每个中间类的虚函数表条目指向各自重写版本,最终对象调用时依据实际类型分发。
内存布局特点
  • 虚基类子对象被移至最末尾,确保唯一性
  • 每个子对象包含虚表指针(vptr),指向独立虚函数表
  • 虚函数调用通过偏移修正(thunk)实现正确跳转

4.4 成员函数指针与虚表联动的深度探索

在C++对象模型中,成员函数指针与虚函数表(vtable)的联动机制是实现多态的核心。当类包含虚函数时,编译器会为其生成一个隐藏的虚表指针(vptr),指向该类的虚函数表。
成员函数指针的存储结构
成员函数指针不仅存储函数地址,还可能包含偏移量和标志位,以区分普通函数、虚函数及多重继承场景下的调整。
class Base {
public:
    virtual void foo() { cout << "Base::foo" << endl; }
    void bar() { cout << "Base::bar" << endl; }
};
typedef void (Base::*FuncPtr)();

Base b;
FuncPtr ptr = &Base::foo;  // 指向虚函数
(b.*ptr)();  // 通过虚表调用
上述代码中,ptr 实际指向虚表中的条目索引,而非直接地址。调用时通过对象的 vptr 查找实际函数地址,实现动态绑定。
虚表布局示例
类类型虚表内容
Base指向 Base::foo 的函数指针

第五章:正确理解虚函数表对系统设计的意义

虚函数表在多态实现中的核心作用
虚函数表(vtable)是C++实现动态多态的关键机制。每个包含虚函数的类都会生成一个vtable,其中存储了指向实际函数实现的指针。对象通过隐藏的vptr指针访问对应vtable,从而在运行时确定调用哪个函数。
  • 提升接口抽象能力,使基类指针可调用派生类方法
  • 支持运行时绑定,增强系统扩展性
  • 为插件架构、工厂模式等提供底层支撑
实战案例:基于vtable的插件系统设计
考虑一个图像处理框架,允许第三方开发滤镜插件:

class ImageFilter {
public:
    virtual ~ImageFilter() = default;
    virtual void apply(const Image& img) = 0; // 虚函数
};

class BlurFilter : public ImageFilter {
public:
    void apply(const Image& img) override {
        // 实际模糊算法
    }
};
加载时通过dlopen动态链接库,查找导出的ImageFilter实例。主程序无需知晓具体类型,仅通过基类接口调用apply,vtable自动路由到正确实现。
性能与内存权衡分析
指标影响
调用开销一次间接寻址(vptr → vtable → 函数)
内存占用每对象增加一个vptr,每类一个vtable
流程图:对象创建 → 分配内存(含vptr) → vptr指向类vtable → 调用虚函数时查表跳转
深入解析C++对象内存模型:从内存对齐到虚函数表实现 内存对齐是计算机系统提升数据访问效率的核心机制,它要求数据存储在特定地址边界上,以减少CPU访问内存的次数。这一原理直接影响了C++中结构体和类的内存布局,编译器通过插入填充字节来满足对齐要求。理解内存模型的技术价值在于,它能帮助开发者编写出缓存友好的高效代码,并避免因内存布局差异导致的隐蔽Bug,例如数据错位和访问违例。在面向对象编程中,虚函数表是实现运行时多态的关键技术,它通过虚函数表指针将函数调用与具体对象动态绑定。这些概念在游戏引擎、高性能计算和系统底层开发等场景中至关重要。本文聚焦于C++对象内存 阅读详情

相关推荐

C++多态虚函数表详解(多重继承、多继承情况)

本文关键词:C++ 多态 虚函数表 虚函数指针 动态绑定 概述:C++相对其他面向对象语言来说,之所以灵活、高效。很大程度的占比在于其多态技术和模板技术。C++虚函数表是支撑C++多态的重要技术,它是C++动态绑定技术的核心。 本文章将着重图解虚函数表相关知识,在阅读本文前,博主已经默认你已经学习了C++多态的语法,并且通过代码实践过。

青城山小和尚 4万+

【C++从0到王者】第二十五站:多继承的虚表

本篇文章着重讲解了多继承与菱形继承的虚表,以及抽象类的使用等方法。也正如抽象类的名字一样,本节内容确实比较抽象。愿可以为读者带来帮助!

青色_忘川的博客 1675

破解拼多多网页字体加密的Python实现(静态)

爬取或者复制粘贴出来发现数字不是6372,而是这样的一个东西 ""从上图我们可以看出数字是一行的空白,后面被浏览器渲染后才展现的数字。我们可以用这个代码查看十六位进制对应的十进制,为什么要看十进制呢?​,而字体文件中的字符映射关系(cmap)也是以十进制存储的。我们搜索这个属性我们可以看到第一个这样的属性有一个URL,这个就是解密的字体包。然后我们构造一个这样的映射字典 key就是对应的十进制,后面的值就是对应的数字。然后我们需要封装一个函数,将加密文字和映射字典传入,返回解密后的数字。

weixin_64179111的博客 3539

C++ - 多继承方式会产生多个虚函数表

1.多重继承可能产生多个虚函数表 代码示例:会产生多个虚函数表 #include <iostream> #include <string> using namespace std; class BaseA { public: virtual void funcA() { cout << "BaseA::funcA()" << endl; } }; class BaseB { public:

weixin_49303682的博客 3201

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例)

本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。

stem5的博客 466

C++ 多态(三)多继承关系的虚函数表与常见问题

C++ 多态(三)多继承关系的虚函数表与常见问题

weixin_59215611的博客 1400

YOLOv8独家原创改进:SPPF原创自研创新 | SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4684

多重继承虚函数表分析

多重继承虚函数表分析 演示在多重继承下,虚函数表的样子 创建两个父类Base1 Base2,并创建Derived先后继承Base1 Base2 ,查看对于各个函数的调用结果 #include <iostream> using namespace std; class Base1 { public: virtual void f() { cout << "Base1::f()" << endl; } virtual void g() { cout <

weixin_46272577的博客 1001

LVGL colorwheel组件教程一(调色板)

【代码】LVGL colorwheel组件教程一(调色板)

摸鱼专家 431

构建基于知识图谱的金融监管合规系统

金融行业是一个高度监管的领域,金融机构需要遵守众多复杂的法规和政策。传统的金融监管合规方式往往依赖于人工审查和简单的规则引擎,效率低下且容易出错。构建基于知识图谱的金融监管合规系统的目的在于利用知识图谱强大的知识表示和推理能力,实现对金融业务数据的自动化分析和合规检查,提高监管合规的效率和准确性。本系统的范围涵盖了金融机构的各类业务,如银行业务、证券业务、保险业务等。

AI天才研究院 1166

C++虚函数表在多继承中的布局策略:99%程序员忽略的关键细节

深入解析C++虚函数表的多继承布局,揭示对象内存模型与虚表指针的底层机制。涵盖多重继承下虚函数调用、菱形继承与虚基类处理等关键场景,提升程序性能与设计灵活性。掌握这些细节,避免常见陷阱,值得收藏。

PixelGlow的博客 745

YOLOv8改进 | Conv篇 | 利用YOLOv9的GELAN模块替换C2f结构(附轻量化版本 + 高效涨点版本 + 结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进YOLOv8中的C2f,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时本文的内容提供了两种版本一种是参数量更低涨点效果略微弱一些的版本(参数量V8n下降80w,计算量为6.1GFLOPs),另一种是参数量稍多一些但是效果要不参数量低的效果要好一些(均为我个人整理),提供两种版本是为了适配不同需求的读者,具体选择

Snu77的博客 7567

C++学习

C++基础学习、函数模板、动态内存、新特性、面向对象编程、类的设计以及STL标准模板库的学习

2601_94965056的博客 224

华为OD机试真题 新系统 2026-08-16 Python&JS【智能家居模式调度优化】

智能家居系统中有多个自动化联动模式,每个模式 modes[i]=[start_time,end_time,power],表示它在左闭右开区间 [start_time,end_time) 内持续消耗固定功率 power。

MISAYAONE的博客 85

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++ 函数语义学——多继承与虚函数:深入理解与最佳实践

多继承下的虚函数:在多继承的情况下,子类可以重写多个基类的虚函数,通过基类指针调用虚函数时,会根据对象的动态类型调用子类的实现。删除用第二基类指针new出来的子类对象:基类的析构函数必须是虚函数,以确保通过基类指针删除对象时,调用的是子类的析构函数,正确销毁对象。非虚析构函数导致内存泄露:如果基类的析构函数不是虚函数,通过基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,可能导致派生类中的资源没有被正确释放,从而引发内存泄露。解决方法。

慢慢记录,慢慢更新。 1359

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++多态原理,单继承和多继承关系的虚函数表详解

多态的原理 虚函数表 在vs编译器中,可以看出来a对象除了有一个_a成员,还多一个__vfptr放在对象的前面,对象中的这个指针叫做虚函数表指针。一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中, 虚函数表也简称虚表。 派生类虚表构建规则 将基类虚表中的内容拷贝一份放到子类虚表中。 如果派生类重写了基类某个虚函数,用派生类自己的虚函数替换原先基类虚函数的入口地...

小白的Coding之旅 1140

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

多重继承下的虚函数表

#include "stdafx.h" #include using namespace std; class Base1 { private:   virtual void A() { cout }; class Base2 { private: virtual void B() {cout }; class Derive : public Base1 ,publi

Tinide的专栏 1705

多重继承的虚函数表

有一个错误:Father的x,y,一开始定义成了int,老师解答,long long * + 3 是加3个 long long ,子类自己添加的虚函数(非重写),在VS中是将此放在第一个继承类的虚函数表里.第一个虚函数表指针:00007FF7095BBD60。第二个虚函数表指针:00007FF7095BBD90。对象地址00000034A26FF4E8。同一个类,不同对象使用同一张虚函数表。不同类使用不同的虚函数表。

holoyh的博客 618

虚函数表分析(单继承情况和多继承情况)

单继承: #include<iostream> #include<stdio.h> using namespace std; class A { public: virtual void x() {cout<<"x()"<<endl;} virtual void y() {cout<<"y()"<<endl;} virtual void z() {cout<<"z()"<<endl;}

qq_38158479的博客 851

【C++】多继承的多态

【C++】多继承的多态,虚表,虚基表

m0_72563041的博客 866

[C++]单/多继承体系中的虚函数表

对于单继承体系中的基类派生类中的虚表关系如下:基类有虚函数,所以基类有一个自己的虚表指针,指向自己的虚表,虚表中存放的就是func1()的地址。派生类继承了基类的虚函数,所以有一个自己的虚表指针,指向自己的虚表,因为派生类重写了基类的虚函数,所以虚表中func1()函数的地址与基类不同。同时派生类又增加了一个虚函数,所以他的虚表里面有两个函数地址。

m0_75062065的博客 1096

详解多态、虚继承、多重继承内存布局及虚表(C++)

详解C++多态、虚继承、多重继承内存布局,及虚函数表,虚表指针。

一枚菜鸡 2969

【c++随笔14】虚函数表

虚函数表是一个由虚函数组成的表格,用于实现动态绑定和多态性。每个包含虚函数的类都有自己的虚函数表,该表列出了该类及其所有基类的虚函数。当一个对象被创建时,它的类虚函数表也被创建,并且可以通过该对象的指针或引用来调用虚函数表中的函数。虚函数表是一种实现动态多态性的机制。每个包含虚函数的类都有一个虚函数表,其中存储着该类的虚函数地址。当通过基类指针或引用调用虚函数时,程序会根据对象的实际类型查找对应类的虚函数表,并调用正确的虚函数。// 基类Aclass A {public:// 基类B。

junxuezheng的博客 2017

c++ - 虚函数表

1.什么是虚函数表 所谓虚函数表就是存放着当前类中所有虚函数地址的表。在实例化一个具有虚函数的类时,这个表 也被分配到这个实例对象的内存中,通过虚函数表可以指明所要调用的函数的位置。在C++编译器 中虚函数表的地址存放在对象的最前面,这是为了即使多继承下也能快速获取到虚函数表。 代码示例: class Base{ public: virtual void A(){cout << "Base::A()" << endl;} virtual void B(){cout &

weixin_49303682的博客 2821
上一篇: Redis缓存过期策略选错=数据堆积?专家教你4步正确配置TTL
下一篇: 你真的懂结构体对齐吗?alignas使用陷阱与最佳实践
VarLens
博客等级 码龄1年 168粉丝 2188原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值