《高级程序设计》ppt课件

上传人:tia****nde 文档编号:67358344 上传时间:2019-01-07 格式:PPT 页数:41 大小:329.31KB
返回 下载 相关 举报
《高级程序设计》ppt课件_第1页
第1页 / 共41页
《高级程序设计》ppt课件_第2页
第2页 / 共41页
《高级程序设计》ppt课件_第3页
第3页 / 共41页
《高级程序设计》ppt课件_第4页
第4页 / 共41页
《高级程序设计》ppt课件_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《《高级程序设计》ppt课件》由会员分享,可在线阅读,更多相关《《高级程序设计》ppt课件(41页珍藏版)》请在金锄头文库上搜索。

1、高级程序设计,主 讲:李晓勇 Email: Telphone:13819194055,一、继承总结,继承方式: public : 公有继承 protected : 保护继承 private : 私有继承 访问控制属性: public : 公有类型 protected : 保护类型 private : 私有类型,继承方式与访问控制属性,公有继承: 基类的公有成员和保护成员作为派生类公有成员时,保持不变,但基类的私有成员不可访问。 私有继承: 基类的公有成员和保护成员作为派生类私有成员,变成私有,但基类的私有成员不可访问。 保护继承: 基类的公有成员和保护成员作为派生类保护成员,变成保护,但基类的

2、私有成员不可访问。,不同继承方式的基类/派生类特性,基类/派生类的关系,任何一个类都可以派生出一个新类,派生类也可以派生出新的类,即一个基类是另一个基类的派生类,构成了类的层次结构。,A,B,C,A 是 B 的基类, B 是 C 基类; 称 B 是 A 的直接派生类; A 是 C 的间接基类;,二 、继承与构造函数/析构函数,1、问题: 类都有构造函数/析构函数,基类/派生类也有。 则 (1)派生类和基类的构造函数和析构函数是如何被调用的? (2)基类构造函数是如何获得实际参数的?,2、规则:,(1)派生类并不继承基类的构造/析构函数,相反派生类的构造函数必须向基类的构造函数提供实参。 (2)

3、创建一个派生类的对象时,则先调用基类的构造函数,然后调用派生类的构造函数;派生类的对象被撤销时析构函数的调用次序相反。,3、派生类构造函数的形式,(): (参数),(参数) 例: B:B(int i ,int k):A(i) b=k; cout“Bs create“endl; ,初始化列表,举例:从vehicle(汽车)派生car(小汽车)类。,#include class vehicle/基类vehicle类的声明 private: /私有数据成员 int wheels; protected: /保护数据成员 float weight; public:/公有函数成员 vehicle(int

4、in_wheels, float in_weight) wheels=in_wheels; weight=in_weight; int get_wheels() return wheels; float get_weight() return weight; ;,/派生类car类的声明 class car:public vehicle private: /新增私有数据成员 int passenger_load; public:/新增公有函数成员 car(int in_wheels, float in_weight,int people=5) :vehicle(in_wheels,in_weig

5、ht) passenger_load=people; int get_passengers() return passenger_load; ;,void main() car bluebird(4,1000); /声明car类的对象 cout“The message of bluebird(wheels,weight,passengers):“endl; coutbluebird.get_wheels()“,“ /输出小汽车的信息 bluebird.get_weight()“,“ bluebird.get_passengers()endl; 程序运行结果为: The message of b

6、luebird(wheels,weight,passengers): 4,1000,5,例,继承中的构造/析构函数,class A public: A() a=0; cout“As default create“endl; A(int i) a=i; cout“As create“endl; A() cout“As deleted“endl; void aprint() couta“,“; int geta() return a; private: int a; ;,class B: public A public: B() b=0;cout“Bs default create“endl; B

7、 (int i, int j, int k); B() cout“Bs deleted“endl; void print(); private: int b; A aa; /类成为数据成员 ; B: B(int i, int j, int k): A(i), aa(j) b=k; cout“Bs create“endl; ,void B:print() aprint(); coutb“,“aa.geta()endl; void main( ) B bb2; bb0= B(1,2,5); bb0.print(); ,As default create As default create Bs d

8、efault create As default create As default create Bs default create As create As create Bs create Bs deleted As deleted As deleted 1,5,2 Bs deleted As deleted As deleted Bs deleted As deleted As deleted,结论: 创建一个派生类的对象时,构造函数的执行次序: (1)先调用基类的构造函数 (2)子对象类的构造函数 (3)派生类的构造函数 派生类的对象被撤销时,析构函数的执行次序: 析构函数的调用次序

9、与构造函数相反。,三、同名覆盖原则 但派生类中存在同基类同名的成员时,派生类覆盖基类;可通过基类名加上”:”在派生类中对基类中的成员进行访问,#include class CA protected: int x,y; public: void set(int m, int n) x=m; y=n; ;,class CB: public CA protected: int x,y; public: void set(int m, int n) x=m; y=n; CA:set(m+2, n+3); ; void main() CB b; b.CA:set(3,4); b.set(23,45);

10、,四、多继承,1、概念 多继承(多重继承):为一个派生类指定多个基类。或者说,一个子类从多个基类中派生出来,它继承了多个类的基本特性。,2、派生类的定义,单继承派生类的定义格式: class : ; 多继承派生类的定义格式: class : , ;,说明: (1)派生类与每个类之间的关系仍可看作是一个单继承。 (2)多个基类中的成员相同时,通过子类的对象调用时,无法确定是哪一个基类的成员,容易产生二义性。,例, 床/沙发/折叠沙发,class bed / 多重继承 public : bed( ):weight(0) void sleep( ) cout“Sleeping.n“; void se

11、tweight( int i ) weight=i; protected: int weight; ; class sofa public: sofa( ): weight(0) void watchtv( ) cout“Watching tv.n“; void setweight(int i) weight=i; protected: int weight; ;,class sleepersofa : public bed, public sofa public: sleepersofa( ) void foldout( ) cout“Fold out the sofa.n“; ; void

12、 main( ) sleepersofa ss; ss.watchtv( ); ss.foldout ( ); ss.sleep ( ); ss.sofa:setweight (90); / ss.setweight (90)错 ,watching tv. Fold out the sofa. sleeping,例、多重继承与构造函数的关系,class B1 public: B1(int i) b1=i; cout“constructor B1.-“iendl; void print( ) coutb1endl; private: int b1; ; class B2 public: B2(i

13、nt i) b2=i; cout“constructor B2.-“iendl; void print( ) coutb2endl; private: int b2; ; class B3 public: B3(int i)b3=i; cout“constructor B3.-“iendl; int getb3( ) return b3; private: int b3; ;,class A: public B2, public B1 public : A(int i, int j, int k, int m):B1(i),B2(j),bb(k) a=m; cout“constructor A

14、.-“mendl; void print( ) /没有该函数则产生二义性 B1:print ( ); B2:print ( ); couta“,“bb.getb3( )endl; private: int a; B3 bb; ; void main( ) A aa(1,2,3,4); aa.print ( ); ,构造函数的执行次序: (1)基类:依派生的次序决定 (2)子对象的构造函数 (3)派生类的构造函数,程序运行结果: constructor B2.-1 constructor B1.-2 constructor B3.-3 constructor A.-4 1 2 4,3,规则: (

15、1)析构函数不能继承; (2)派生类中要定义自己的析构函数释放在派生中新增的成员; (3)从基类中继承的成员释放,可以通过基类的析构函数实现; (4)激活析构函数的顺序与构造函数缴活顺序相反。,例、多重继承与析构函数的关系,#include class B1 public: B1(int i) cout“constructor B1-“iendl; B1( )cout“destructing B1“endl; ; class B2 public: B2(int j) cout“constructor B2-“jendl; B2( )cout“destructing B2“endl; ; class C: public B2,public B1 public: C(int a, int b ,int c, int d ) :B1(a),memberB2(d),memberB1(c ),B2(b) private: B1 memberB1; B2

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号