首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么时候vptr(指向vtable)被初始化为多态类?

当一个多态类的对象被创建时,vptr(指向vtable)会被初始化。vtable是一个表格,它存储了虚函数的地址。vptr是一个指针,它指向这个表格。当一个多态类的对象被创建时,vptr会被初始化为指向该类的vtable。这样,在调用虚函数时,程序可以根据vptr找到正确的函数地址来执行。

例如,假设我们有一个名为Animal的基类,其中有一个名为speak的虚函数。我们还有一个名为Dog的派生类,它重写了speak函数。当我们创建一个Dog对象时,它的vptr会被初始化为指向Dog类的vtable。这个vtable包含了Dog类的speak函数的地址。当我们调用这个Dog对象的speak函数时,程序会根据它的vptr找到正确的函数地址来执行。

总之,vptr在多态类的对象被创建时被初始化,以便在调用虚函数时能够找到正确的函数地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++为什么要弄出虚表这个东西?

int age; // 年龄(注意,这不是数据库,不必一定存储生日) void (*desc)(struct Actress*); } Actress; // obj中各个字段的值不一定初始化过...因为调用哪个函数是编译期间就确定了的,编译期间只能识别父的desc()。 好了,现在我们对于C++如何应用多态有了一定的了解,那么多态又是如何实现的呢?...也就是说在含有虚函数的编译期间,编译器会自动给这种类在起始位置追加一个虚表指针,一般称之为:vptrvptr指向一个虚表,称之为:vtable 或vtbl,虚表中存储了实际的函数地址。...更新:vptr指向的并不是虚表的表头,而是直接指向的虚函数的位置。...= 168, weight = 50, age = 20}, cup = "36D"} vptr指向的是Sensei的vtable + 16个字节的位置,也就是虚表的地址。

51610

C++面试题

当一个构造函数调用时,它做的首要的事情之一是初始化它的VPTR。因此,它只能知道它是“当前”的,而完全忽视这个对象后面是否还有继承者。...而且,只要它是最后的构造函数调用,那么在这个对象的生命期内,VPTR将保持初始化为指向这个VTABLE, 但如果接着还有一个更晚派生的构造函数调用,这个构造函数又将设置VPTR指向它的 VTABLE...VPTR的状态是由最后调用的构造函数确定的。这就是为什么构造函数调用是从基到更加派生顺序的另一个理由。...但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置VPTR指向它自己的VTABLE。...如果函数调用使用虚机制,它将只产生通过它自己的VTABLE的调用,而不是最后的VTABLE(所有构造函数调用后才会有最后的VTABLE)。 3. 什么时候需要定义虚析构函数?

1.7K42
  • 【C++】多态 ⑦ ( 多态机制实现原理 | 虚函数表概念 | 虚函数表工作机制 | vptr 指针 | 虚函数表运行时机制 | 虚函数与动态联编 )

    一、多态原理 1、多态成立的三个条件 " 多态 " 实现需要满足以下三个条件 : 首先 , 要有 继承关系 ; 然后 , 父中的函数需要有 virtual 关键字修饰 , 子类重写该 " 虚函数 "...; 最后 , 父指针 或 父引用 指向 子类的对象 ; 满足 ① 继承 , ② 虚函数重写 , ③ 父指针/引用指向子类对象 三个条件 , 即可实现多态 ; 2、虚函数表概念 " 多态 " 的机制..., 由 " 虚函数表 " 实现 ; " 虚函数表 " , 英文名称为 " Virtual Function Table " , 简称 Vtable ; C++ 编译器 通过将 虚函数指针 放入 基...vptr 指针 如果 C++ 中存在 virtual 虚函数 , 在创建对象时 , 会生成 虚函数表 Virtual Function Table , 简称 vtable ; C++ 编译器 编译 代码时... virtual 关键字修饰 , 则该函数是 虚函数 , C++ 编译器编译该类时 , 会自动生成一个 虚函数表 , 并为对象设置一个 vptr 指针 , 指向该 虚函数表 , 在调用时 , 需要查找

    34930

    【C++篇】虚境探微:多态的流动诗篇,解锁动态的艺术密码

    第一章:多态的原理 1.1 虚函数表的概念 虚函数表(Virtual Table, VTable)是 C++ 实现运行时多态的核心机制。...它是一个存储虚函数指针的数组,每个包含虚函数的都至少有一个虚表。当一个的虚函数调用时,程序并不是直接调用函数的地址,而是通过虚函数表间接调用。...每个对象实例都会保存一个指向虚表的指针(vptr),通过 vptr,程序可以找到对象对应的虚函数实现。...每个对象只包含一个指向虚表的指针(vptr)。虚表本身存储在程序的全局静态区中。每个包含虚函数的的所有对象共享同一个虚表,而 vptr指向这个表的指针。...虚函数表指针(vptr):指向 Derived2 的虚函数表。 虚基表指针(vbase ptr):指向 Base 的唯一实例。

    11810

    本周阅读:深度探索C++对象模型

    译成中文就是,编译器必须要确保如果一个对象有一个或多个vptr,这些vptr不是由原对象来初始化或改变的。 也就是说:当使用赋值的方式或拷贝构造的方式创建一个对象时,这个对象的vptr与源对象无关。...经由一组隐含的转化操作(把一个derived class指针转化为一个指向其plublic base type的指针) Through a set of implicit conversions, such...the vptr Initialization 第5.2章节] 补充内容 错误理解3 vptr是是在构造函数内初始化的, 正确理解: 在父构造函数之后,子类构造函数之前(因为子类构造函数可能执virtual...上述完成之后, 对象的vptr会被初始化, 指向相关的虚表 如果有成员初始化列表的话, 将在构造函数体内扩展开来; 这必须在vptr 设定之后才进行, 以免有一个虚成员函数调用 最后执行程序员所提供的代码...编程规范 不要在构造函数中调用虚函数 3 C++编译期多态与运行期多态 补充内容 程序员的自我修养6.4.2节,关于ELF各个section的解释见 在gcc编译器的实现中虚函数表vtable存放在可执行文件的只读数据段

    78820

    抽象为什么不能实例化?

    首先,语法上,抽象不能实例化,这是语法规定。强制实例化一个抽象的代码,编译器会报错。...其次,从继承和多态思想的角度而言,抽象基的目的是建立一个公共接口,建立公共接口的唯一原因是它能对于每个不同的子类有不同的表示。...实现上,通过在虚函数结尾处加上"=0"来声明纯虚函数: virtual void func() = 0; 虚函数与多态的原理在于,带有虚函数的及其派生,其对象内部会有一个指向VTABLE的指针,即vptr...通过这样的机制,可以保证以指针或引用方式(即地址)访问派生对象时,总是会通过vptr指向的虚表中某个特定索引位置上的函数地址,调用实际指针或引用所指的派生对象定义的虚函数实现。...因此,只要有一个函数在中被声明为纯虚函数,则VTABLE就是不完全的。 如果一个VTABLE是不完全的,当某人试图创建这个的对象时,编译器做什么呢?它不能安全地创建一个纯抽象的对象。

    59920

    多态实现-虚函数、函数指针以及变体

    的引用或者指针指向一个派生对象,当该基变量调用该函数时候,会自动调用派生的函数,这就是所谓的动态多态。...编译器会为每个存在虚函数的对象插入一个vtpr(virtul function pointer),该vptr指向存放了虚函数地址的虚函数表vtbl,这样对象在调用虚函数的时候,第一步会先根据vptr找到...= address of b.vtable; b.vtable[0]= &Base::Print; b.vtable[1]= &Base::fun; 在上述代码中,有一个Base,其中定义了两个虚函数...[offset])(ptr); 其中: ptr为对象地址 vptr表示由编译器产生的指针,指向虚函数表。...特点 在前面的内容中,我们讲了使用虚函数以及variant来实现多态的方案,既然二者都能实现多态,那么我们什么时候使用虚函数什么时候使用variant呢?

    93120

    从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图

    一、多态 多态性是面向对象程序设计的重要特征之一。 多态性是指发出同样的消息不同类型的对象接收时有可能导致完全不同的行为。...由于vptr在对象中的偏移不会随着派生层次的增加而改变,而且改写的虚函数在派生vtable中的位置与它在基vtable中的位置始终保持一致,有了这两条保证,再加上改写虚函数与其基中对应虚函数的原型和调用规范都保持一致...程序中通过基的指针或引用可以通过vptr间接访问到Derived::Fun1, Derived:::Fun2,但因为Fun3不是虚函数(基的Fun3 继承后隐藏),故p->Fun3(); 和bs.Fun3...    //vptr 指向的虚函数表     delete pmydoc;     return 0; } ?...割,将CMyDoc对象转换成基CDocument对象时,调用了CDocument的拷贝构造函数,CMyDoc的额外成员如data2_消失,成为完全一个 CDocument对象,包括vptr指向的虚函数表

    1.1K00

    轻松搞定面试中的“虚”

    外定义虚函数时,不必再加virtual。该函数就是虚函数了。虚函数是多态性的基础,其调用的方式是动态联编(程序运行时才决定调用基的还是子类)。...显然的是:当我们构造一个子类的对象时,先调用基的构造函数,构造子类中基部分,子类还没有构造,还没有初始化,如果在基的构造中调用虚函数,如果可以的话就是调用一个还没有初始化的对象,那是很危险的,所以...因此,它需要多出一个指向子对象的指针。 8.什么是虚函数表?...为实现动态联编,编译器为每个包含虚函数的创建一个表,称为vtable,在vtable中,编译器放置了特定的虚函数地址,在每个带有虚函数的中编译器会秘密地设置一个虚函数表指针,称为vptr指向对象的...vtable,通过基指针做虚函数调用时,也就是多态调用时,编译器静态地插入取得这个vptr,并在vtable表种查找函数地址的代码,这样就能调用正确的函数。

    66920

    面试官:连 C++ 虚函数表都不知道,不想跟你聊了

    为了让每个包含虚表的的对象都拥有一个虚表指针,编译器在中添加了一个指针,*__vptr,用来指向虚表。 这样,当的对象在创建时便拥有了这个指针,且这个指针的值会自动设置为指向的虚表。... A, B, C 的对象都拥有一个虚表指针,*__vptr,用来指向自己所属的虚表。...首先,根据虚表指针p->__vptr来访问对象bObject对应的虚表。 虽然指针p是基A*类型,但是*__vptr也是基的一部分,所以可以通过p->__vptr可以访问到对象对应的虚表。...A vtbl,这样p->__vptr指向 A vtbl。...那么,什么时候会执行函数的动态绑定?这需要符合以下三个条件。

    84340

    c++头脑风暴-多态、虚继承、多重继承内存布局

    = 0x4008e0 这一行,其中vptr其实就是虚表指针,vtable就表示虚表,所以有了虚函数,对象就会相应的增加一个虚指针。...多态的原理 派生中实现基类同样的虚函数,其实就是多态的基本操作啦,先看一下直接使用派生对象是怎么样的,如下: #include using namespace std; class...总结一下:c++继承时的多态一般指的运行时多态,使用基指针或者引用指向一个派生对象,在非虚继承的情况下,派生直接继承基的虚表指针,然后使用派生的虚函数去覆盖基的虚函数,这样派生对象通过虚表指针访问到的虚函数就是派生的虚函数了...= 0x400c58 , a = 0 }, members of B: _vptr.B = 0x400c08 , a = 0 }, members of B: _vptr.B = 0x400c08 <vtable

    68820

    C++:从技术实现角度聊聊RTTI

    在C++中,由于存在多态行为,基指针或者引用指向一个派生,而其指向的真正类型,在编译阶段是无法知道的: Base *b = new Derived; Base &b1 = *b; 在上述代码中,如果想知道...多态 多态,我们知道经常用于运行时,也就是说在运行时刻才会知道其指针或者引用指向的具体类型,如果要对一个包含虚函数的对象获取其类型信息(typeid),那么也是在运行时才能具体知道,举例如下: #include...我们以Base指针实际指向Derived对象为例,vtable for Derived:部分代表着Derived的虚函数表内容,其中有一行typeinfo for Derived代表着Derived的...这个函数先通过src_ptr来初始化部分局部变量: • vtable 通过对src_ptr解引用(deref)获取 • vtable_prefix 子对象虚函数表地址,通过vtable的类型信息和offset_to_top...查看定义,__si_class_type_info 包含指向类型的单个指针,而 __vmi_class_type_info 包含指向类型的指针数组。

    1K90

    【C++】多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的和没有定义虚函数的大小 )

    对比 定义了 虚函数 的 与 没有定义虚函数的 的大小 , 其它成员都相同 , 定义了虚函数的多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; 一、验证指向 虚函数表...的 vptr 指针 是否存在 1、虚函数表与 vptr 指针由来 " 虚函数表 " 由 C++ 编译器 负责 创建 与 维护 , virtual 关键字 修饰的 虚函数 , 会自动 C++ 编译器...1 个虚函数 ; 如果 没有虚函数 , 就不会生成虚函数表 ; 如果 中有 virtual 虚函数 , 则 该类的 每个对象 中 , 都有一个 指向 虚函数表的 vptr 指针 ; 虚函数表 存储...会生成 虚函数表 Virtual Function Table , 简称 vtable ; C++ 编译器 编译 代码时 , 会自动为该类 添加 一个 vptr 指针 成员变量 , 该指针 会指向 虚函数表...指针指向 虚函数表 首地址 Child c; // 将父指针指向子类对象 p = &c; // 通过父指针调用子类对象的 fun 函数 p->fun(1); // 打印 Parent

    20940
    领券