概述
C++ 是面向对象的程序设计,除了和 C 一样支持 程序模型,同时也支持 抽象数据类型模型 和 面向对象模型,由于这些引起了 C++ 的复杂性,下面对 C++ 对象进行简要的分析。
关于对象
C
语言相关:程序性 —— 数据 与 操作 分开;
C++
相关:抽象数据类型 和 面向对象模型;
- 相对于程序性的设计,
C++
增加了布局和存取时间上的额外负担(该负担主要由 virtual
功能引起):
- 用于支持一个有效“执行期绑定(runtime binding)”的
virtual function
机制;
- 用以实现“多次出现在继承体系中的 base class,有一个单一而被共享的实例”的
virtual base class
机制;
C++
中 class 中的数据成员和成员函数:
- data members:static data members 和 nonstatic data members;
- member functions:static member functions、nonstatic member functions 和 virtual member functions;
- 对象模型:
- 简单对象模型:每个 object 是一系列的 slots,每个 slots 指向一个 member(包括 data members 和 member functions),相当于指针,member 本身并不保存在 object 对象中;
- 表格驱动对象模型:每个 object 对象包含一个指向 data member table 和一个指向 member function table 的指针。data member table 保存的是 data 本身,而 member function table 保存的是一系列的指向 member function 的 slots;
C++
对象模型:
- nonstatic data members 放在每一个 class object 之内;
- static data members 放在个别的 class object 之外;
- static member functions 和 nonstatic member functions 放在个别的 class object 之外;
- virtual member functions:
- 每一个 class 产生多个指向 virtual functions 的指针,由这些指针组成虚函数表 virtual table(vtbl);
- 每一个 class object 添加一个指向虚函数表 virtual table 的指针,这个指针被称为 vptr;
C++
继承:
- 单一继承:继承 base class 的数据;
- 多重继承:从多个 base class 继承数据;
- 虚继承:virtual base class 不管在继承链中被派生多少次,只会存在一个实例;每一个 class object 保存指向 virtual base class 实例的指针;
C++
多态:
C++
只有通过 pointer 指针 和 reference 引用的间接处理多态;
- 支持多态的方法:
- 隐式的转换操作:例如 基类对象指针指向派生类对象;
- virtual function 机制:通过指针调用相对应的函数;
- dynamic_cast 和 typeid 运算符:dynamic_cast 使派生类对象指针能够指向基类对象;
- class object 内存大小:
- object 内部 nonstatic data member 的总和;
- 内存对齐引起的填充字节空间;
- 由 virtual 功能引起的额外负担;
- 指针类型:
- 根据其所寻址的 object 类型引导编译器解释某个特定地址中的内存内容及其大小;
- 类型为
void *
的指针只能够持有一个地址,而不能通过它操作所指向的 object 对象;
- 类型转换 static_cast(静态转换)、const_cast(常量转换)、dynamic_cast(动态转换)、reinterpret_cast(重解释转换) 不会改变指针的真正地址,它只影响所指的内存大小及其内容的解释方式;
- 多态的内存布局: pointer 指针 和 reference 引用的间接处理多态,不会引发内存地址改变,只是改变他们所指向的内存的大小及其内容的解释方式;