类的继承与多态性.pptVIP

  • 1
  • 0
  • 约1.04万字
  • 约 58页
  • 2023-11-26 发布于广东
  • 举报
执行C的构造函数前先调用B1、B2构造函数;执行B1、B2构造函数前先分别调用A的构造函数。 A B1 B2 C A为C的公共基类 eg. 数据成员二义性 三、混合多继承中的构造函数 class C:public B1,public B2 { }; 本文档共58页;当前第30页;编辑于星期六\13点53分 1、数据成员二义性 假设图中类A有数据成员a, 则C中有两个a成员,a是哪个 派生类的成员?产生了二义性。 解决方法: (1)加类名分辨符B1:: 或 B2:: (2)定义虚基类 eg1. 数据成员二义性 A(a) B1(a,b1) B2(a,b2) C(a,b1,b2,c) 四、多继承中二义性问题的解决 本文档共58页;当前第31页;编辑于星期六\13点53分 2、函数成员二义性 B1,B2中都含有print() 成员函数,C继承了B1,B2, 则C中有两个print()函数。 解决方法:加类区分符:: eg2. 函数成员二义性 B1(print()) B2(print()) C 本文档共58页;当前第32页;编辑于星期六\13点53分 §9.3 虚基类 消除数据成员二义性的两种方法的区别: (1)”类名::”法:消除二义性同时实现程序设计的多态性,但在派生类对象中存在多个公共基类的同名数据成员 (2)”虚函数”法:消除二义性,且在派生类对象中只存在一个公共基类的数据成员 设计虚基类: (1)一个基类有多于一个派生类时, 在这些派生类“继承方式”前加上 virtual 关键字。 class B1:virtual public A class B2:virtual public A 此时将公共基类A称为虚基类。 A B1 B2 C 本文档共58页;当前第33页;编辑于星期六\13点53分 (2) 虚基类子对象由最新派生出来的派生类直接初始化。 B1,B2对类A子对象初始化, C 也要对类A子对象初始化。  eg. 虚基类 注意:对非虚基类,不能在C中对A类子对象初始化。 A B1 B2 C 本文档共58页;当前第34页;编辑于星期六\13点53分 §9.4类的虚函数和多态性 对于相同的函数调用,依赖每个对象自己做出恰当的响应,这是多态性的关键思想。 多态性(polymorphism):不同对象在接收同样的消息时,所做出的响应不同。 多态性的实现依赖于动态联编。 指调用名称相同的成员函数 指不同派生类的成员函数 本文档共58页;当前第35页;编辑于星期六\13点53分 一、滞后联编 联编:指一个标识符名和一个存储地址联系在一起的过程。 1、静态联编(早期联编) 指:联编工作出现在编译连接阶段,因为这种联编过程在程序开始运行之前完成,所以又称早期联编。 在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又被称为束定,因此,静态联编又称为静态束定。 2、动态联编(滞后联编) 指:在程序执行时进行的联编,称动态联编,或称动态束定,又叫滞后联编。    动态联编时在不同阶段被束定的类的对象将是不同的。 动态联编的实现:C++中,在虚函数的支持下实现。 本文档共58页;当前第36页;编辑于星期六\13点53分 二、虚函数的定义 1、定义: virtual 成员函数原型; 2、注意:  (1)只有在类的继承关系中才存在虚函数。在基类中声明某成员函数为虚函数,则派生类中(名字、参数个数、参数类型和返回值类型都)相同的成员函数都视作虚函数。  (2)使用虚函数须利用赋值兼容规则,要求public继承方式。 (3)多态性使我们编写的程序在处理同一个类层次结构下类的对象时好像它们是基类的所有对象一样。 本文档共58页;当前第37页;编辑于星期六\13点53分 三、虚函数的使用 多态性是利用基类的指针句柄和基类的引用句柄,而不是利用名字句柄。 实现多态的步骤: (1)定义基类指针 (2)用该指针指向基类或派生类对象  (3)当程序发送虚函数消息时:若指针指向基类对象,系统调用基类成员函数,若指针指向派生类对象,系统调用派生类成员函数。  (4)若没有步骤(2)中赋值,系统按早期联编方式调用基类成员函数。 本文档共58页;当前第38页;编辑于星期六\13点53分 class X1{ int x; public: X1(int xx=0){x=xx;}

文档评论(0)

1亿VIP精品文档

相关文档