`
weiyinchao88
  • 浏览: 1234658 次
文章分类
社区版块
存档分类
最新评论

C++多态中的VPTR

 
阅读更多

以下文字摘录自<<C++编程思想>>(Bruce Eckel):

C++中的关键字virtual告诉编译器对于某个成员函数进行动态绑定,而且自动装载实现动态绑定所必须的所有机制。
为了完成这件事,编译器对每个包含虚函数的类创建一个表 (称为VTABLE)。在VTABLE中,编译器旋转特定类的虚函数地址。在每个带有虚函数的类中,编译器“秘密”地置一指针,称为vpointer (缩写为VPTR),指向这个对象的VTABLE。通过基类指针(或者引用)做虚函数调用时,也就是做多态调用时,编译器静态地插入取得这个VPTR,并在VTABLE表中查找函数地址的代码,这样就能调用正确的函数使动态绑定发生。

为了看到VPTR,特编写如下函数:VPTR

class no_virtual{
int a;
public:
void x() const {}
int i() const { return 1; }
};

class one_virtual{
int a;
public:
virtual void x() const {}
int i() const { return 1; }
};

class two_virtuals{
int a;
public:
virtual void x() const {}
virtual int i() const { return 1; }
};

void main()
{
cout<<"int:"<<sizeof(int)<<endl;
cout<<"no_virtual:"
<<sizeof(no_virtual)<<endl;
cout<<"void*:"<<sizeof(void*)<<endl;
cout<<"one_virtual:"
<<sizeof(one_virtual)<<endl;
cout<<"two_virtuals:"
<<sizeof(two_virtuals)<<endl;
}


不带虚函数,对象的长度恰好就是所期望的:单个int的长度。而带有单个虚函数的one_virtual,对象的长度是no_virtual的长度加上一个void指针的长度。它反映出,如果有一个或多个虚函数,编译器将在这个结构中插入一个指针(VPTR)。在one_virtual和two_virtuals之间没有区别。这是因为VPTR指向一个存放地址的表,只需要一个指针,因为所有虚函数地址都包含在这个表中。

分享到:
评论

相关推荐

    c++多态总结

    c++多态总结,vptr总结,多态原理探究

    C++多态的实现

    ### C++多态的实现 在面向对象编程中,多态是一种重要的概念,它允许我们以统一的方式处理不同类型的对象。C++中的多态主要通过虚函数机制来实现。本文将详细探讨C++中如何实现多态,并通过具体示例说明如何在实际...

    c++多态实现原理分析1

    C++ 多态实现原理分析 C++ 的多态性是面向对象开发中一个非常重要的特性,它允许程序在运行时根据不同的对象类型执行不同的函数,从而实现多种行为。那么,C++ 是如何实现多态性的呢?下面我们将深入探讨 C++ 多态...

    c++多态内存布局1

    本文将深入探讨C++中的多态内存布局,并结合提供的部分内容进行解析。 首先,了解C++类的内存布局对于理解多态性至关重要。一个类的内存通常分为三部分:数据成员、非虚函数指针(如果有的话)和虚函数表指针(vptr...

    C++虚函数和多态学习笔记

    在C++中,当一个类中有至少一个虚函数时,编译器会为这个类创建一个虚函数表(VTABLE),并在每个该类的对象中隐式地添加一个虚函数指针(VPTR),用于指向该对象的虚函数表。 ##### VTABLE VTABLE是一个数组,...

    从汇编看c++中多态的应用

    在c++中,当一个类含有虚函数的时候,类就具有了多态性。构造函数的一项重要功能就是初始化vptr指针,这是保证多态性的关键步骤。构造函数初始化vptr指针下面是c++源码: 代码如下:class X {private: int i;public:...

    C++虚函数多态的工作原理

    `,编译器会在生成的机器代码中插入指令,动态地从VPTR获取VTABLE的地址,然后在VTABLE中查找对应的虚函数地址,从而调用正确的函数。这种机制被称为晚期绑定或运行时绑定,与早期绑定(编译时绑定)不同,它允许...

    从汇编看c++中的多态

    在c++中,当一个类含有虚函数的时候,类具有了多态性。构造函数的一项重要功能是初始化vptr指针,这是保证多态性的关键步骤。  构造函数初始化vptr指针  下面是c++源码: class X { private:  int i; ...

    从汇编看c++中的多态详解

    本文将从汇编的角度探讨C++中基于虚函数的动态多态。 首先,虚函数是实现多态的基础。当一个类声明了一个或多个虚函数时,编译器会为该类创建一个虚函数表(Virtual Table,简称vtable),其中包含了虚函数的指针。...

    深入解析C++中的虚函数与多态

    1.C++中的虚函数C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是...

    虚函数是C++中用于实现多态(polymorphism)的机制

    ### C++中的虚函数及其实现多态的机制 #### 一、虚函数的概念与作用 在C++中,虚函数是一种特殊类型的成员函数,它的主要目的是实现多态性(polymorphism)。多态性允许子类重写父类的方法,并且能够在运行时根据...

    实验七运行中的多态和虚函数

    - C++中通过虚表(vtable)和虚指针(vptr)实现动态绑定,即在运行时确定调用哪个版本的函数。 4. **虚函数表的工作原理**: - 每个包含虚函数的类都会有一个虚函数表,其中存储了所有虚函数的地址。 - 对象中包含一...

    每天一个IDA小技巧(五)C++基本特性1

    C++ 实现虚函数的⽅方法是:为每个类对象添加⼀一个隐藏成员,隐藏成员保存了⼀一个指针,这个指针叫虚表指针(vptr),它指向⼀一个虚函数表(virtual function table,vtbl)。在运⾏行时创建对象时,对象的虚表...

    探索MinGW是如何存储对象、如何实现类继承、多态

    5. **C++多态**: - 多态允许通过基类指针或引用调用派生类的重写函数,实现动态绑定。 - 动态绑定依赖于虚函数和虚函数表,只有在运行时才能确定调用哪个函数实现。 - 多态是面向对象设计的重要特性,它允许我们...

    C++中的虚函数表图解

    在C++中,虚函数是实现多态性的重要机制,多态是指使用父类型的指针或引用能够调用子类的成员函数,从而允许不同类型的对象以统一的方式进行处理。这种特性使得C++具备了泛型编程的能力,即用不变的代码解决可变的...

    深度探索C++对象模型_中英

    2. **内存管理**:C++的对象在内存中有特定的布局,包括成员变量的位置、虚函数表(vptr)的存在等。理解静态存储区、栈存储区和堆存储区的区别,以及new、delete操作符的工作方式,对于优化代码和避免内存泄漏至关...

    VC8.0上多态的实现

    多态是面向对象编程中的一个核心概念,它允许子类重写父类的方法,从而使得不同的对象可以对同一消息做出不同的响应。在C++中,通过虚函数(virtual function)来实现多态性,这为程序提供了高度的灵活性和可扩展性...

    effective_C++、STL源码剖析(中文完整版)、深度探索C++对象模型

    2. **继承与多态**:分析了单一继承和多重继承下的对象模型,以及动态绑定(多态)的实现原理,如虚函数表和vptr。 3. **内存管理**:探讨了栈和堆上的对象管理,包括局部对象的生命周期和动态分配对象的内存分配与...

    c++的三特点

    在C++中,多态主要通过虚函数(virtual function)实现。虚函数允许在基类中声明一个函数,在派生类中重写它,从而在运行时根据对象的实际类型调用正确的函数版本。这在给定的代码中得到了体现,`print()` 和 `geti...

Global site tag (gtag.js) - Google Analytics