class 是一种特殊的 struct
在内存中 class 依旧可以看作变量的集合
class 和 struct 遵循相同的内存对齐原则
class 中的成员函数和成员变量是分开存放的
- 每个对象有独立的成员变量
- 所有对象共享类中的成员函数
值得思考的问题
运行时的对象退化为结构体的形式
所有成员变量在内存中依次排布
成员变量间可能存在内存间隙
可以通过内存地址直接访问成员变量
访问权限关键字在运行时失效
类中的成员函数位于代码段中
调用成员函数时对象地址作为参数隐式传递
成员函数通过对象地址访问成员变量
C++ 语法隐藏了对象地址的传递过程
继承对象模型
在 C++ 编译器的内部类可以理解为结构体
子类是由父类成员叠加子类新成员得到的
C++ 多态的实现原理
当类中声明虚函数时,编译器会在类中生成一个虚函数表
虚函数表是一个存储成员函数地址的数据结构
虚函数表是由编译器自动生成与维护的
virtual 成员函数会被编译器放入虚函数表中
存在虚函数时,每个对象都有一个指向虚函数表的指针
小结
C++ 中的类对象在内存布局上与结构体相同
成员变量和成员函数在内存中分开存放
访问权限关键字在运行时失效
调用成员函数时对象成员作为参数隐式传递
继承的本质就是父子间成员变量的叠加
C++ 中的多态就是通过虚函数表实现的
虚函数表是由编译器自动生成与维护的
虚函数表的调用效率低于普通函数