ImageVerifierCode 换一换
格式:PPT , 页数:25 ,大小:164KB ,
资源ID:371803      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-371803.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(面向对象程序设计与C++.PPT)为本站会员(国***)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

面向对象程序设计与C++.PPT

1、面向对象程序设计与C+,第八章 继承,教 师: 王 涛 电 话: 51688243办公室: 九教北512E-mail: ,1.派生类的概念,类是具有相同特征(属性特征和行为特征)的对象集合的抽象。继承是对象类的一种相关关系,具有如下性质:类间的共享特征类间的细微区别类间的层次结构,引入继承的目的在于重用已有代码。,为什么使用继承,如已有字符串类stringclass string/ 字符串类char* contents;public:int get_length();char* get_contents();void set_contents(char* contents);void disp

2、lay();,为什么使用继承,要实现一个可编辑的字符串类edit_string:,class edit_string / 可编辑字符串类char* contents;int cursor;/ 当前游标 public:int get_length();char* get_contents();void set_contents(char* contents);void display();int get_cursor_pos();int add_at_cursor(char* new_text);int replace_at_cursor(char* new_text);int delete_a

3、t_cursor(int how_much);,通过引入继承:,class edit_string: public string/ 可编辑字符串类int cursor;public: int get_cursor_pos();int add_at_cursor(char* new_text);int replace_at_cursor(char* new_text);int delete_at_cursor(int how_much);,为什么使用继承,派生类的定义有三种:私有派生公有派生保护派生,派生类的定义,class x /* */ ;class y: x/ 私有派生/ ;class y

4、: public x/ 共有派生/ ;class y: protected x/ 保护派生/ ;,派生类,当继承基类时,派生类就获得了基类所有数据成员的副本, 同时也拥有了基类声明的所有接口.class Aint a, b;class B: class Aint x, y;sizeof(A) = 8;sizeof(B) = 16;,派生类对基类成员的访问权:在派生类的域范围内,是否可以直接访问基类对象的成员?派生类对基类成员的继承:是否可以正常使用继承于基类的成员?class Aprivate: int x; protected: int y; public: int z;class B: p

5、ublic Avoid f() A a; a.x = 0; a.y = 0; a.z = 0; / 是否可访问a.x, a.y, a.z? x = 0; y = 0; z = 0; / 是否可使用A中声明的x,y,z ;,2.派生类对基类成员的访问与继承,派生类对基类成员的访问权,派生类是不同于基类的新类,他对基类成员的访问权取决于基类成员类型,与派生方式无关。派生类对基类成员的访问权可归结如下表:,示例程序:08_01,从上表可看出,派生类对基类成员的访问权,与其他任何类对基类的访问权一样。,派生类对基类成员的继承性(也就是派生类中是否可使用基类中声明的成员),取决于基类成员的类型,与派生方

6、式无关。可归结为下表:,派生类对基类成员的继承性,示例程序:08_02,派生方式影响什么?,派生方式决定:基类成员在派生类中的安全类型。私有派生. 基类的public成员和protected成员继承到派生类后,成为派生类的private成员.保护派生.基类的public成员和protected成员继承到派生类后,成为派生类的protected成员.公有派生.公有派生不改变继承成员的安全类型。通过如下方式可以改变继承成员的安全属性。class A public int x, y; void f1(); ;class B: A public A:x; /注意:前面不要写int. A:f1; / x

7、,f1都为public类型示例程序: 08_03。,派生类域:同名变量和函数,派生类域被自动嵌套在基类类域中.class base protected:int x;public: base() x = 0; inc(); void inc() +x; void display() cout “base: x = “ x endl; ;class derive: public base protected: int x;public: derive() x = 10; inc(); base:inc(); void inc() x += 10; void display() cout “deri

8、ve: x = “ x endl; ;main()base b; derive d;b.display(); d.display(); d.base:display(); ,3.派生类的构造函数与析构函数,派生类构造函数执行之前,自动调用基类的构造函数.派生类析构函数执行之后,自动调用基类析构函数.,class Apublic:A() printf(“nconstruct A.”); A() printf(“ndestroy A.”); ;class B: public Apublic:B() printf(“nconstruct B.”); B() printf(“ndestroy B.”)

9、; ;main() B b;,输出:construct A.construct B.destroy B.destroy A.,若基类构造函数带参数,必须在派生类的构造函数的初始化成员列表中将参数传入.class Aint x;public: A(int xv) x = xv;class B: public Apublic: B(int xv):A(xv) ;main()B b(0);,派生类的构造函数与析构函数,若派生类中包含类对象成员,则构造函数调用顺序:基类成员对象派生类;析构函数调用顺序正好相反。,派生类的构造函数与析构函数,class Aprotected: int x;public:

10、 A(int n) x = n; cout “A(): x = “ x endl; A() cout “A(): x = “ x endl; ;class B: public A A a;public: B(int n):a(1) ,A(0) x = n; cout “B(): x = “ x endl; B() cout “B(): x = “ x endl; ;main() B b(2); ,输出:A(): x = 0A(): x = 1B(): x = 2B(): x = 2A(): x = 1A(): x = 2,4. 多继承,当一个类具有多个类所具有的特点,就可能用到多继承。,单继承

11、,多继承,多继承的定义,多继承的定义如下:class A /* */ ;class B/* */ ;class C: A, B /* */ ;/ 对A,B都为私有派生class C:public A, B/* */ ;/ 对A公有派生,对B私有派生class C:A, public B/* */ ;/ 对A私有派生,对B公有派生class C:public A, public B/*/;/ 对A,B都为公有派生在多继承中,派生类对基类成员的访问权和继承性的规则与单继承相同.,多继承的构造函数与析构函数,多继承中,派生类的构造函数和析构函数调用时,也会自动调用基类的构造函数和析构函数.基类构造函

12、数的调用顺序与定义继承的顺序一致,析构函数的调用顺序则相反。class Apublic: A() cout “A().” endl;A() cout “A().” endl;class Bpublic: B()cout “B().” endl;B() cout “B().” endl;class C: B, Apublic: C() cout “C().” endl; C() cout “C().” endl;main() C c; ,输出:B().A().C().C().A().B().,虚拟继承和虚基类,class xprotected: int a;public: x() a = 10;

13、 ;class x1: public xpublic: x1() cout a endl; ;class x2: public xpublic: x2() cout a endl; ;class y: x1, x2public: y() cout a endl; / error.应使用 x1:a或x2:a;,当类之间的继承关系出现如下棱形关系时,如使用普通继承,派生类中就会出现公共基类成员的多个副本。为了使派生类中只保留公共基类成员的一个副本,需要使用虚继承:class x1: virtual public x /*/;class x2: virtual public x/*/;,虚拟继承和虚

14、基类,虚拟继承和虚基类,class xprotected: int a;public: x() a = 10; ;class x1: virtual public x/ 虚拟继承public: x1() cout a endl; ;class x2: virtual public x/ 虚拟继承public: x2() cout a endl; ;class y: x1, x2public: y() cout a endl; / ok;,在多继承时,使用虚继承的基类与使用非虚继承的基类初始化顺序不同:虚继承的构造函数在非虚继承的之前调用.若同一层次中包含多个虚继承,这些虚继承的构造函数按他们说

15、明的顺序调用.无论任何方式的继承,基类的构造函数在派生类的构造函数之前调用.示例程序08_04,虚继承的初始化顺序,虚拟继承和虚基类,有关多继承,虚拟继承和虚基类等知识的详细说明,请参考C+ Primer(E3)或Thinking in C+(E2)中相关章节。多继承在成员使用及向上映射时容易引发二义性问题,应尽量避免使用。虚拟继承比非虚拟继承开销大,也应尽量避免使用。,5. 继承举例,示例程序08_05: 给定一个线性表类list,分别派生出栈类stack和队列类queue.线性表:元素依次呈线性结构(链表,数组都是线性表)栈: 操作受限的线性表,只能对栈顶的元素进行操作.队列: 操作受限的线性表.删除时只能删除队头;插入时只能插入到队尾.,上 机 题,教材P251习题7-5,7-10,7-11.仿照示例程序08_05,用数组实现线性表类array,从array中派生子类stack和queue,实现出栈,入栈,出队列,入队列等操作,

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。