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

上传人:国*** 文档编号:360780 上传时间:2018-09-27 格式:PPT 页数:25 大小:164KB
下载 相关 举报
面向对象程序设计与C++.PPT_第1页
第1页 / 共25页
面向对象程序设计与C++.PPT_第2页
第2页 / 共25页
面向对象程序设计与C++.PPT_第3页
第3页 / 共25页
面向对象程序设计与C++.PPT_第4页
第4页 / 共25页
面向对象程序设计与C++.PPT_第5页
第5页 / 共25页
点击查看更多>>
资源描述

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,实现出栈,入栈,出队列,入队列等操作,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

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

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

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