您好,欢迎访问三七文档
信息与管理科学学院席磊面向对象程序设计•概述•一个简单的C++程序•基本数据类型和表达式•复合数据类型•指针•控制结构•函数•类和对象•友元•继承与派生•多态性、方法重载和虚拟函数•流继承与派生•类的继承与派生•类成员的访问控制•单继承与多继承•派生类的构造、析构函数•类成员的标识与访问类之间的关系has-A,uses-A&is-A•has-A包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。•uses-A一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。•is-A机制称为“继承”。关系具有传递性,不具有对称性。类的继承与派生•继承与派生问题举例工具车轿车面包车小汽车卡车旅行车汽车交通工具类的继承与派生•继承与派生问题举例猴子狮子虎猎豹猫鸟动物类的继承与派生•继承与派生问题举例圆矩形几何形状类的继承与派生•继承–保持已有类的特性而构造新类的过程。•派生–在已有类的基础上新增自己的特性而产生新类的过程。•被继承的已有类称为基类(或父类)。•派生出的新类称为派生类。继承是类之间定义的一种重要关系派生类可以具有基类的特性,共享基类的成员函数,使用基类的数据成员,还可以定义自己的新特性,定义自己的数据成员和成员函数。classB:classAAdata;Afunction;B_Data;B_Fuction;A_Data;A_Function;继承关系的特点(1)一个派生类可以有一个或多个基类只有一个基类时,称为单继承;有多个基类时为多继承。(2)继承关系可以是多级的即可以有类Y继承类X和类Z继承类Y同时存在。(3)不允许继承循环不能有类Y继承类X、类Z继承类Y和类X继承类Z同时存在。继承是类之间定义的一种重要关系一个B类继承A类,或称从类A派生类B类A称为基类(父类),类B称为派生类(子类)AB1B2C1C2C3B1,B2的基类A的派生类C1,C2,C3的基类A的派生类(单继承)C3的基类B1,B2的派生类(多继承)B1的派生类类的继承与派生•继承与派生的目的–继承的目的:实现代码重用。–派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。类的继承与派生•派生类的定义:class派生类名:继承方式基类名{成员定义;}类成员的访问控制•继承方式–不同继承方式的影响主要体现在:1、派生类成员对基类成员的访问控制。2、派生类对象对基类成员的访问控制。•三种继承方式–公有继承–私有继承–保护继承•范例分析类成员的访问控制•公有继承(public)–基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问。–派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。–通过派生类的对象只能访问基类的public成员。classA{public:voidget_XY();voidput_XY();protected:intx,y;};voidA::get_XY(){coutEntertwonumbersofx,y:;cinxy;}voidA::put_XY(){coutx=x,y=y'\n';}例1公有继承的测试7.2.1访问控制classAclassC:publicBclassB:publicAclassB:publicA{public:intget_S(){returns;};voidmake_S(){s=x*y;};//使用基类数据成员x,yprotected:ints;};classC:publicB{public:voidget_H(){coutEnterh:;cinh;}intget_V(){returnv;}voidmake_V(){make_S();v=get_S()*h;}//使用基类成员函数protected:inth,v;};例1公有继承的测试7.2.1访问控制classA{public:voidget_XY();voidput_XY();protected:intx,y;};classB:publicA{public:intget_S();voidmake_S();//使用基类数据成员x,yprotected:ints;};classC:publicB{public:voidget_H();intget_V();voidmake_V();//使用基类成员函数protected:inth,v;};保护数据成员在类层次中可见7.2.1访问控制例1公有继承的测试classAclassC:publicBclassB:publicAvoidmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}7.2.1访问控制例1公有继承的测试voidmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBxysobjC.hobjC.vobjC.sobjC.yobjC.xobjChv7.2.1访问控制例1公有继承的测试voidmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用基类A成员函数对objB的数据成员操作xyshv7.2.1访问控制例7-1公有继承的测试对objA的数据成员操作调用基类A成员函数对objC的数据成员操作voidmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用派生类C成员函数对objC的数据成员操作xyshv7.2.1访问控制例7-1公有继承的测试调用派生类B成员函数对objB的数据成员操作类成员的访问控制•私有继承(private)–基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可访问。–派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。–通过派生类的对象不能访问基类中的任何成员。classA{public:voidget_XY();voidput_XY();protected:intx,y;};classB:privateA{public:intget_S(){returns;}voidmake_S(){get_XY();s=x*y;}private:ints;};例2私有继承的测试1classB:privateAclassA7.2.1访问控制classA{public:voidget_XY();voidput_XY();protected:intx,y;};classB:privateA{public:intget_S(){returns;}voidmake_S(){get_XY();s=x*y;}private:ints;};例2私有继承的测试1classB:privateAclassA7.2.1访问控制调用基类成员函数访问私有数据成员#includeiostream.hclassA{……};classB:privateA{……};voidmain(){BobjB;coutItisobject_B:\n;objB.make_S();coutS=objB.get_S()endl;}7.2.1访问控制objB.sobjB.yobjB.xobjBprivate成员例2私有继承的测试1classB:privateAclassAclassA{public:A(){x=1;}intget(){returnx;}voidoperator++(){x++;}private:intx;};classB:publicA{public:B(){y=1;}intget(){returny;}voidopertor++(){y++;}private:inty;};例3私有继承的测试2classB:publicAclassA基类的私有数据成员不能在派生类中直接访问但存储空间存在7.2.1访问控制#includeiostream.hclassA{…};classB:publicA{...};voidmain(){Aa;couta.x=a.get()endl;Bb;++b;coutb.x=b.A::get()endl;coutb.y=b.get()endl;}b.xa.xb.y例3私有继承的测试2创建派生类对象调用基类派生类构造函数b.x=1b.y=1调用基类版本同名函数返回b.x的值调用派生类版本同名函数返回b.y的值类成员的访问控制•保护继承(protected)–基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问。–派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。–通过派生类的对象不能访问基类中的任何成员。类成员的访问控制•protected成员的特点与作用–对建立其所在类对象的模块来说(水平访问时),它与private成员的性质相同。–对于其派生类来说(垂直访问时),它与public成员的性质相同。–既实现了数据隐藏,又方便继承,实现代码重用。类成员的访问控制•protected成员举例classA{protected:intx;}intmain(){Aa;a.X=5;//错误}classA{protected:intx;}cla
本文标题:C++课件多态
链接地址:https://www.777doc.com/doc-3391308 .html