`
shi5jin
  • 浏览: 38041 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

一种“标准”的虚函数机制简介

阅读更多
    编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?Lippman在深度探索C++对象模型中的不同章节讲到了几种方式,这里把“标准的”方式简单介绍一下。

    我所说的“标准”方式,也就是所谓的“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数,就会为其搞一个虚函数表,也就是VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写,针对1.1中的例子:

void bar(A * a)
{
    a->foo();
}

会被改写为:

void bar(A * a)
{
    (a->vptr[1])();
}

    因为派生类和基类的foo()函数具有相同的VTABLE索引,而他们的vptr又指向不同的VTABLE,因此通过这样的方法可以在运行时刻决定调用哪个foo()函数。

    虽然实际情况远非这么简单,但是基本原理大致如此。
分享到:
评论

相关推荐

    详细讲述c++虚函数实现

    总结来说,C++的虚函数机制是通过虚函数表来实现多态性,使得我们能够在运行时根据对象的实际类型动态地调用合适的函数。理解这一机制对于深入学习C++的继承和多态性至关重要,同时也有助于掌握其他依赖于此机制的...

    C++ 虚函数详细解析

    本文详细介绍了C++中的虚函数机制及其实现方式,包括虚函数表的结构和工作原理。通过具体的示例分析,我们不仅了解了虚函数的基本概念,还掌握了其实现细节。虚函数作为多态性的核心组成部分,对于理解和编写高质量...

    C++中析构函数定义成虚函数的原因.doc

    在C++编程中,为了实现多态性,虚函数机制被广泛采用。然而,在某些特定场景下,尤其是涉及到派生类和基类之间的对象管理时,将析构函数声明为虚函数显得尤为重要。本文将深入探讨为何在C++中推荐将析构函数定义为虚...

    虚函数的作用

    在C++编程语言中,虚函数是一种特殊类型的成员函数,它的主要功能在于支持面向对象编程中的多态特性。多态允许使用基类类型的指针或引用来指向派生类的对象,并通过该基类类型的指针或引用调用实际属于派生类的成员...

    C++ 虚函数表解析

    这种机制是泛型编程的一种形式,旨在用不变的代码处理可变的数据结构或算法。C++中的泛型技术包括模板、RTTI(运行时类型信息)和虚函数,它们分别在编译时或运行时解决多态问题。 虚函数的实现是通过虚函数表...

    CPlusPlus虚函数表解析

    C++的虚函数机制是面向对象编程中的一个重要概念,它实现了多态性,允许通过基类指针调用派生类重写的成员函数。多态是C++泛型技术的一种体现,旨在用不变的代码处理可变的数据或算法。虚函数就是通过虚函数表...

    虚函数与重载函数的关系

    虚函数和重载函数是C++中两种不同的函数机制,它们在实现多态性方面各自发挥着作用。本文将详细探讨这两种函数的概念、区别以及它们之间的关系。 首先,让我们了解什么是函数重载(Overload)。函数重载允许在同一...

    C++程序的设计机制1 NVI机制.docx

    NVI机制是一种将虚函数声明为非公有的机制,该机制能够将接口定义和实现分离,提高程序的灵活性和可维护性。 NVI机制的基本思想是,将虚函数声明为非公有成员,而将公有成员函数声明为非虚函数。这样,基类可以提供...

    【本人课设代码】C++学生成绩管理系统课程设计【多态 虚函数】

    虚函数是C++中实现动态绑定的关键机制。在基类中声明一个虚函数,使得在派生类中可以重新定义这个函数,即使是在基类指针或引用调用时,也能调用到派生类中的实现。这样,系统可以根据实际的对象类型动态地选择执行...

    c++中虚函数的实现详解

    总的来说,C++的虚函数机制是通过虚函数表和虚函数指针来实现的,它允许动态地调用正确版本的函数,提供了面向对象编程中的多态性。尽管实现细节可能因编译器而异,但理解这一机制对于深入理解C++对象模型和运行时...

    c++空对象指针也可调用成员函数.rar

    然而,C++引入了虚函数机制,允许我们安全地处理这种情况。 虚函数的主要作用在于实现多态性,即同一类型的指针可以调用不同子类重写的成员函数。在类定义中,通过在成员函数前加上`virtual`关键字,即可声明该函数...

    C++程序设计,主要为C++语言简介、面向对象的基本概念、类和对象进阶、运算符重载、类的继承与派生、多态与虚函数等章节总结

    编译时多态通过函数重载实现,运行时多态通过虚函数和虚函数表实现。 10. **输入/输出流** 和 **文件操作**:C++的`ifstream`和`ofstream`类用于文件的读写,`getline`函数可用于读取一行文本,`eofbit`标志表示...

    c++程序设计讲义 C++的初步认识 类和对象 运算符重载 继承与派生 多态性与虚函数 输入输出流

    C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动等各个领域。本讲义旨在帮助初学者理解和掌握C++的基础知识,特别是以下几个核心概念: 1. C++的初步认识:C++是C语言的扩展...

    C++消息机制

    模板函数或模板类可以看作是一种通用的消息处理机制,它们接受不同类型的数据,根据传入的类型执行不同的操作。例如,`std::sort`函数就是一个模板函数,可以用于排序各种类型的容器。 5. 信号与槽机制: 虽然C++...

    vc++ 函数经典 vc++ 函数经典 vc++ 函数经典

    C++11引入了lambda表达式,它提供了一种快速创建匿名函数的方式,常用于函数对象和算法。 以上是VC++函数经典的一些关键概念,掌握这些知识点将有助于编写高效、灵活的C++程序。在实际编程中,应结合具体需求灵活...

    C++语言中的虚函数研究-综合文档

    虚函数是C++中实现多态性的一种机制,允许我们通过基类指针或引用调用派生类重写的成员函数,即使我们只知道基类类型的指针。这种行为被称为动态绑定或晚期绑定,与早期绑定(编译时绑定)形成对比。动态绑定使得...

    dlopen加载c++ 函数及类

    在IT行业中,动态链接库(Dynamic Link Library,简称DLL)是操作系统提供的一种机制,它允许程序在运行时加载和使用其他模块。在Unix和Linux系统中,这种功能由`dlopen`函数实现。本篇文章将深入探讨如何使用`...

    C++之多态实现机制剖析

    在C++编程语言中,多态(Polymorphism)是一种核心特性,它允许我们使用一个接口来表示多种不同的类型,增强了代码的灵活性和可扩展性。多态的实现主要依赖于虚函数(Virtual Functions)和纯虚函数(Pure Virtual ...

    吉林大学2002级C++面向对象程序设计试题答案

    在C++中,STL(Standard Template Library)是一种标准库,提供了许多容器类,例如vector、list、map等。STL容器可以使得编程更加方便和高效。 十二、异常处理 在C++中,异常处理是一种机制,用于处理程序中的错误...

Global site tag (gtag.js) - Google Analytics