编译器是如何针对
虚函数产生可以再运行时刻确定被调用函数的代码呢?也就是说,虚函数实际上是如何被编译器处理的呢?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++编程语言中,虚函数是一种特殊类型的成员函数,它的主要功能在于支持面向对象编程中的多态特性。多态允许使用基类类型的指针或引用来指向派生类的对象,并通过该基类类型的指针或引用调用实际属于派生类的成员...
这种机制是泛型编程的一种形式,旨在用不变的代码处理可变的数据结构或算法。C++中的泛型技术包括模板、RTTI(运行时类型信息)和虚函数,它们分别在编译时或运行时解决多态问题。 虚函数的实现是通过虚函数表...
C++的虚函数机制是面向对象编程中的一个重要概念,它实现了多态性,允许通过基类指针调用派生类重写的成员函数。多态是C++泛型技术的一种体现,旨在用不变的代码处理可变的数据或算法。虚函数就是通过虚函数表...
虚函数和重载函数是C++中两种不同的函数机制,它们在实现多态性方面各自发挥着作用。本文将详细探讨这两种函数的概念、区别以及它们之间的关系。 首先,让我们了解什么是函数重载(Overload)。函数重载允许在同一...
NVI机制是一种将虚函数声明为非公有的机制,该机制能够将接口定义和实现分离,提高程序的灵活性和可维护性。 NVI机制的基本思想是,将虚函数声明为非公有成员,而将公有成员函数声明为非虚函数。这样,基类可以提供...
虚函数是C++中实现动态绑定的关键机制。在基类中声明一个虚函数,使得在派生类中可以重新定义这个函数,即使是在基类指针或引用调用时,也能调用到派生类中的实现。这样,系统可以根据实际的对象类型动态地选择执行...
总的来说,C++的虚函数机制是通过虚函数表和虚函数指针来实现的,它允许动态地调用正确版本的函数,提供了面向对象编程中的多态性。尽管实现细节可能因编译器而异,但理解这一机制对于深入理解C++对象模型和运行时...
然而,C++引入了虚函数机制,允许我们安全地处理这种情况。 虚函数的主要作用在于实现多态性,即同一类型的指针可以调用不同子类重写的成员函数。在类定义中,通过在成员函数前加上`virtual`关键字,即可声明该函数...
编译时多态通过函数重载实现,运行时多态通过虚函数和虚函数表实现。 10. **输入/输出流** 和 **文件操作**:C++的`ifstream`和`ofstream`类用于文件的读写,`getline`函数可用于读取一行文本,`eofbit`标志表示...
C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动等各个领域。本讲义旨在帮助初学者理解和掌握C++的基础知识,特别是以下几个核心概念: 1. C++的初步认识:C++是C语言的扩展...
模板函数或模板类可以看作是一种通用的消息处理机制,它们接受不同类型的数据,根据传入的类型执行不同的操作。例如,`std::sort`函数就是一个模板函数,可以用于排序各种类型的容器。 5. 信号与槽机制: 虽然C++...
C++11引入了lambda表达式,它提供了一种快速创建匿名函数的方式,常用于函数对象和算法。 以上是VC++函数经典的一些关键概念,掌握这些知识点将有助于编写高效、灵活的C++程序。在实际编程中,应结合具体需求灵活...
虚函数是C++中实现多态性的一种机制,允许我们通过基类指针或引用调用派生类重写的成员函数,即使我们只知道基类类型的指针。这种行为被称为动态绑定或晚期绑定,与早期绑定(编译时绑定)形成对比。动态绑定使得...
在IT行业中,动态链接库(Dynamic Link Library,简称DLL)是操作系统提供的一种机制,它允许程序在运行时加载和使用其他模块。在Unix和Linux系统中,这种功能由`dlopen`函数实现。本篇文章将深入探讨如何使用`...
在C++编程语言中,多态(Polymorphism)是一种核心特性,它允许我们使用一个接口来表示多种不同的类型,增强了代码的灵活性和可扩展性。多态的实现主要依赖于虚函数(Virtual Functions)和纯虚函数(Pure Virtual ...
在C++中,STL(Standard Template Library)是一种标准库,提供了许多容器类,例如vector、list、map等。STL容器可以使得编程更加方便和高效。 十二、异常处理 在C++中,异常处理是一种机制,用于处理程序中的错误...