non-inline member funcitons->只会有一个函数实例
inline function->在每一个使用者产生一个函数实例
C++对象模式
C++中有两种class data members:
- static
- nostatic
三种class member functions:
- static
- nostatic
- virtual
virtual functions支持步骤: - 1.每个class产生出一堆指向virtual functions的指针,放在表格中。即虚表。
- 2.每个class object安插一个虚指针vptr,指向相关的虚表。每个class相关联的type_info object(用以支持运行时身份辨别)也放在虚表的第一个solt。
虚继承解决:在class object中为每一个有关联的虚基类加上一个指针(或建立一个虚基类表;或扩充原有的虚表用以维护虚基类的位置)
关键词带来的差异
C++中处于同一访问区段(assess section)的数据必须保证其声明顺序在内存布局中。
但处于不同访问区段的数据顺序不一致。
基类和派生类的数据成员的布局也没有完全的先后顺序规定。
strcut关键词作用:将一个复杂的class object全部或部分传递到某个C函数中,struct可以对其进行封装,并保证其拥有与C兼容的空间布局。(组合情况下才有用,如果为继承,编译器会决定是否有额外的数据被安插到base struct subobject中。
对象的差异
- 1.程序模型
- 2.抽象数据类型模型:被指定的object是一个具有固定且单一类型的实例。在编译期间就已经完全定义好了。速度快,空间更紧凑。
- 3.面向对象模型:被指定的object的真实类型在每一个特定的执行点之前无法解析。设计更加有弹性。
C++支持多态的方法:
- 1.经由一组隐式的转化操作。如把一个派生类指针指向一个基类。
- 2.经由虚函数操作
- 3.经由dynamic_cast和typied运算符。
多态的主要用途:经由一个共同的接口来影响类型的封装。
一个class object的所占内存大小
- 1.nonstatic data members的总和大小
- 2.为了支持虚函数而内部产生的任何额外负担
- 3.处于译注进行补全
指针的类型
指针类型用于教导编译器如何解释某个特定地址中的内存内容及其大小。(故一个void *的指针能够持有一个地址,但无法通过其操作所指的Object)
指针类型转换并不改变一个指针所含的真正的地址,只影响“被指出的内存的大小和内容”的解释方式。
如果将派生类赋值给基类,派生类被切割,derived type消失,用以塞入较小的Base class内存中。多态不再呈现。