虚函数表的本质
虚函数表(vtable)是C++实现动态多态的核心机制。
它本质上是一个函数指针数组,每个包含虚函数的类都有自己的虚函数表,而每个对象都包含一个指向该表的指针(vptr)。
给一个例子:
虚函数调用的详细过程
虚函数表的性能考虑
内存开销
- 每个包含虚函数的类有一个虚函数表(静态)
- 每个对象有一个vptr指针(通常4或8字节)
- 虚函数调用需要额外的指针解引用
虚函数表的设计哲学
为什么需要虚函数表?
-
运行时多态:在编译时无法确定具体调用哪个函数
-
接口统一:通过基类指针调用不同派生类的实现
-
扩展性:新增派生类不需要修改现有代码
高内聚(做好一件事)
含义: 一个模块(可以是一个类、一个组件或一个函数)内部的所有部分都是为了完成一个单一、明确的目标而紧密协作的。它就像是一个“专家”。
简单说: 专一、自治、不自相矛盾。
松耦合(保持简单关系)
含义: 模块与模块之间的依赖关系要尽可能的少、尽可能的简单。修改一个模块,应该尽可能少地影响到其他模块。
简单说: 独立、换零件容易、牵一发不动全身。
两者的关系
高内聚和松耦合是相辅相成的,通常一个设计良好的系统会同时具备这两个特点。
- 高内聚是从内部要求自己变得“专一”。
- 松耦合是从外部要求自己与其他模块保持“距离”。
一个高内聚的模块,因为职责清晰单一,它对外界的依赖自然就会减少,也就更容易实现松耦合