深入理解 C++ 中的虚函数和虚表

embedded/2024/9/25 11:19:03/

在 C++ 中,虚函数和虚表是实现多态性(polymorphism)的核心机制。通过虚函数,C++ 实现了运行时多态性,允许通过基类指针或引用调用派生类的特定实现。本文将深入探讨虚函数和虚表的概念、工作原理以及它们在实际编程中的应用。

1. 虚函数的定义和作用

虚函数是在基类中声明为虚拟的函数。它允许在继承链中的派生类中进行覆盖(override),即可以为每个派生类提供特定的实现,同时通过基类指针或引用调用这些函数时,确保调用正确的派生类版本。

class Base {
public:virtual void show() {std::cout << "Base class\n";}
};class Derived : public Base {
public:void show() override {std::cout << "Derived class\n";}
};

在上述例子中,show() 被声明为虚函数,派生类 Derived 重写了这个函数,提供了自己的实现。

2. 虚表(vtable)的概念和构建

虚表是用来实现动态绑定的关键数据结构,每个包含虚函数的类都有一个对应的虚表。虚表是一个指针数组,其中每个指针指向一个虚函数的实现。当对象被创建时,会在对象的内存布局中添加一个指向适当虚表的虚表指针(vptr)。

  • 虚表的构建
    • 每个类的虚表在编译时由编译器生成。对于包含虚函数的类,编译器会生成一个虚表,并在其中按照虚函数声明的顺序填充函数地址。
    • 对于多重继承的情况,每个直接基类都有自己的虚表。派生类的虚表包含所有直接基类的虚表,并添加自己的虚函数
3. 虚函数调用的实现过程

虚函数调用通过以下步骤实现动态绑定:

  • 当通过基类指针或引用调用虚函数时,编译器会通过对象的虚表指针(vptr)找到正确的虚表。
  • 根据调用的函数在虚表中的索引,编译器可以确定要调用的具体函数的地址。
  • 运行时,程序会跟随虚表指针找到正确的函数地址,并执行对应的函数。
4. 多态性的应用场景

虚函数和虚表的存在使得 C++ 可以实现多态性,这对于面向对象设计中的多种情况非常有用:

  • 基类指针和引用:可以使用基类指针或引用来管理和操作派生类对象,而无需关心具体对象的类型。
  • 运行时决策:在运行时根据对象的实际类型来选择调用的函数,而不是在编译时静态确定。
5. 总结

虚函数和虚表是 C++ 实现多态性的核心机制,它们通过运行时的动态绑定机制使得程序能够根据对象的实际类型来选择正确的函数实现。理解虚函数和虚表的工作原理有助于更有效地设计和使用面向对象的代码,实现更灵活和可扩展的程序结构。


http://www.ppmy.cn/embedded/92653.html

相关文章

TDD-LTE和FDD-LTE

目录标题 TDD-LTE系统区别OFDM FDD-LTE TDD-LTE系统 TDD-LTE系统通过时分双工技术在同一个频段上进行上行和下行传输。 TDD-LTE&#xff1a;通过时间分割在不同时隙同一频段内进行上下行传输&#xff0c;适用于上下行业务量不对称的场景。 区别OFDM TDD-LTE系统的上下行链路…

LVS集群中的负载均衡技术

目录 一、LVS技术原理 二、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 三、DR模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 四、ipvsadm命令及参数 1、管理集群服务&#x…

计算机网络TCP/UDP知识点

这是一些在学习过程中关于计算机网络八股文的一些知识点记录&#xff1a; TCP/UDP TCP怎么保证可靠性 1.序列号&#xff0c;确认应答&#xff0c;超时重传 数据到达接收方&#xff0c;接收方需要发出一个确认应答&#xff0c;表示已经收到该数据段&#xff0c;并且确认序号…

C++篇:入门(2)

引用 引用的概念以及定义&#xff1a; 在C中&#xff0c;引用&#xff08;Reference&#xff09;是一个非常重要的概念又可以称之为取别名&#xff0c;它允许我们创建一个已存在对象的别名。引用提供了一种机制&#xff0c;通过它可以直接访问另一个变量、对象或函数的值&#…

PCIe学习笔记(18)

Completion完成规则 所有的Read, Non - Posted Write和AtomicOp请求都需要Completion。Completion包括一个Completion头&#xff0c;对于某些类型的完成&#xff0c;后面会跟着一些DW的数据。 •Completion通过ID路由&#xff0c;并使用3 DW头。 ◦请注意&#xff0c;路由ID…

从入门到精通:接入视频美颜SDK与直播美颜插件详解

本篇文章&#xff0c;笔者将为你详细解析美颜SDK从入门到精通的全过程&#xff0c;帮助你轻松掌握这项技术。 一、什么是视频美颜SDK与直播美颜插件&#xff1f; 视频美颜SDK是一组预构建的代码库和工具&#xff0c;开发者可以将其嵌入到移动应用或平台中&#xff0c;从而实现…

【Material-UI】按钮组件中的实验性API:Loading按钮详解

文章目录 一、LoadingButton 组件概述1. 组件介绍2. 基本用法 二、LoadingButton 组件的高级用法1. 自定义加载指示器2. 图标与加载位置 三、已知问题与解决方法1. Chrome 翻译工具与 LoadingButton 的兼容性问题 四、实用性与未来展望1. 应用场景2. 未来展望 五、总结 Materia…

鸿蒙系统开发【加解密算法库框架】安全

加解密算法库框架 介绍 本示例使用ohos.security.cryptoFramework相关接口实现了对文本文件的加解密、签名验签操作。 实现场景如下&#xff1a; 1&#xff09;软件需要加密存储本地文本文件&#xff0c;需要调用加解密算法库框架选择密钥文本文件&#xff0c;对本地文本文…