对象
空间布局及存取时间
virtual带来了什么?—>存储布局变化及访问时间变化
- 虚函数机制:支持执行期间绑定
- 虚基类:实现多次出现在继承体系同的基类,有一个单一而被共享的实体
- 派生类与基类之间的转换
对象模型
- 成员:静态成员、非静态成员
- 函数:静态函数、非静态函数、虚函数
note: 仅仅只有非静态成员对象内,其他被存储至所有的class对象之外
虚函数:
- 虚表:存放指向虚函数的指针(每个类都会有一张(所有该类对象共同拥有),派生类会生成兼容基类的虚表)
- 虚表指针:对象空间中指向虚表的指针,该指针的设定由ctor自动完成。每个类关联的type_info对象会放置在虚表的第一个位置(用来支持运行时类型识别),其他虚函数按照申明顺序依次放置到虚表中(先基类,在派生类,最后是本类中声明顺序)
支持pod类型
保证与C兼容的空间布局,使用组合而不是继承
对象的差异
- 多态操作要求对象只能是一个指针或引用,指针或引用之所以支持多态,是因为他们并不会引发内存中任何与类型有关的内存委托操作;会受到改变的只是他们所指向的内存的大小和内容解释方式
- C++的多态只存在于一个个公有类体系中,非公有的派生行为以及类型为void*的指针可以说是多态,但并没有被语言明白地支持,只能通过程序员明白的转型操作来管理。C++以下列 方式支持多态:
- 经由一组隐含的转换操作,如一个基类指针指向公有继承的子类对象
- 经由虚函数机制(对象调用虚函数)
- 经由dynamic_cast和typeid运算符
- 多态的主要用途是经由一个共同的接口来影响类型的封装,这个接口通常被定义在一个抽象的基类中
- 类对象需要多少内存:
- 非静态数据成员的总和大小
- 对齐而填补的字节数
- 为支持虚函数而产生的额外负担
- 指针类型:指针类型会教导编译器如何解释某个特定地址中的内存内容及其大小
- 所以转型其实是一种编译器指令,大部分情况下并不改变一个指针所含的真正地址,只影响被指出之内存的大小和内容的解释方式
- 也是为什么一个void*的指针只能够含有一个地址而不能通过它操作所指的object的缘故
- 加上多态之后:如果虚函数被定义为inline,则效率上有很大的收获