C++学习笔记(39):虚函数表、高内聚|松耦合

0 阅读2分钟

虚函数表的本质

虚函数表(vtable)是C++实现动态多态的核心机制。

它本质上是一个函数指针数组,每个包含虚函数的类都有自己的虚函数表,而每个对象都包含一个指向该表的指针(vptr)。

给一个例子:

image.png

image.png

虚函数调用的详细过程

image.png

虚函数表的性能考虑

内存开销

  • 每个包含虚函数的类有一个虚函数表(静态)
  • 每个对象有一个vptr指针(通常4或8字节)
  • 虚函数调用需要额外的指针解引用

image.png

虚函数表的设计哲学

为什么需要虚函数表?

  1. 运行时多态:在编译时无法确定具体调用哪个函数

  2. 接口统一:通过基类指针调用不同派生类的实现

  3. 扩展性:新增派生类不需要修改现有代码

高内聚(做好一件事)

含义: 一个模块(可以是一个类、一个组件或一个函数)内部的所有部分都是为了完成一个单一、明确的目标而紧密协作的。它就像是一个“专家”。

简单说: 专一、自治、不自相矛盾。

松耦合(保持简单关系)

含义: 模块与模块之间的依赖关系要尽可能的少、尽可能的简单。修改一个模块,应该尽可能少地影响到其他模块。

简单说: 独立、换零件容易、牵一发不动全身。

两者的关系

高内聚和松耦合是相辅相成的,通常一个设计良好的系统会同时具备这两个特点。

  • 高内聚是从内部要求自己变得“专一”。
  • 松耦合是从外部要求自己与其他模块保持“距离”。

一个高内聚的模块,因为职责清晰单一,它对外界的依赖自然就会减少,也就更容易实现松耦合