C++ 第七章 类的继承和派生.pptVIP

  • 29
  • 0
  • 约1.52万字
  • 约 72页
  • 2017-06-13 发布于湖北
  • 举报
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * “is-a”举例 class Truck: public Automobile{ //卡车 public: void load(…); //装货 void dump(…); //卸货 private: …… }; class Pumper: public Automobile { //消防车 public: void water(); //喷水 private: …… }; 意义 卡车是汽车 消防车是汽车 接口 卡车和消防车具有汽车的通用功能(移动) 它们还各自具有自己的功能(卡车:装货、卸货;消防车:喷水) * 深 度 探 索 派生类对象的内存布局 派生类对象的内存布局 因编译器而异 内存布局应使类型兼容规则便于实现 一个基类指针,无论其指向基类对象,还是派生类对象,通过它来访问一个基类中定义的数据成员,都可以用相同的步骤 不同情况下的内存布局 单继承:基类数据在前,派生类新增数据在后 多继承:各基类数据按顺序在前,派生类新增数据在后 虚继承:需要增加指针,间接访虚基类数据 * 深 度 探 索 单继承情形 class Base { … }; class Derived: public Base { … }; Derived *pd = new Derived(); Base *pb = pd; * Derived类型指针pd转换为Base类型指针 时,地址不需要改变 Base类 数据成员 Derived类新增 数据成员 pb, pd Derived对象 深 度 探 索 多继承情形 class Base1 { … }; class Base2 { … }; class Derived: public Base1, public Base2 { … }; Derived *pd = new Derived(); Base1 *pb1 = pd; Base2 *pb2 = pd; * Derived类型指针pd转换为Base2类型指针 时,原地址需要增加一个偏移量 Base1类 数据成员 Base2类 数据成员 pb1, pd Derived对象 pb2 Derived类新增 数据成员 深 度 探 索 虚拟继承情形 class Base0 { … }; class Base1: virtual public Base0 { … }; class Base2: virtual public Base0 { … }; class Derived: public Base1, public Base2 { … }; Derived *pd = new Derived(); Base1 *pb1 = pd; Base2 *pb2 = pd; Base0 *pb0 = pb1; * Base0类 数据成员 Base1类新增 数据成员 pb1, pd Base0指针 Base1类新增 数据成员 Base0指针 Derived对象 pb2 pb0 通过指针间接访问虚基类的数据成员 深 度 探 索 基类向派生的转换 基类向派生类的转换 基类指针可以转换为派生类指针 基类引用可以转换为派生类引用 需要用static_cast显式转换 例: Base *pb = new Derived(); Derived *pd = static_castDerived *(pd); Derived d; Base rb = d; Derived rb = static_castDerived (rb); * 深 度 探 索 类型转换时的注意事项(1) 基类对象一般无法被显式转换为派生类对象 对象到对象的转换,需要调用构造函数创建新的对象 派生类的拷贝构造函数无法接受基类对象作为参数 执行基类向派生类的转换时,一定要确保被转换的指针和引用所指向或引用的对象符合转换的目的类型: 对于Derived *pd = static_castDerived *(pb); 一定要保证pb所指向的对象具有Derived类型,或者是Derived类型的派生类。 * 深 度 探 索 类型转换时的注意事项(2) 如果A类型是B类型的虚拟基类,A类型指针无法通过static_cast隐含转换为B类型的指针 可以结合虚继承情况下的对象内存布局,思考为什么不允许这种转换 void指针参加的转换,可能导致不可预期的后果: 例:(Base2是Derived的第二个公共基类) Derived *pd = new Derived(); void *pv = pd; //将Derived指针转换为void指针 Base2 *

文档评论(0)

1亿VIP精品文档

相关文档