下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
has-A
包含关系,用以描述一个类由多个“部件类”构成。一个类中的数据成员是另一种已经定义的类对象。如:家庭(Family)有多个成员(Member)组成uses-A
一个类使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。如:学生(student)完成某一任务(task)is-A
“继承”机制-从已有的类基础上建立新类软件重用(softwarereusability)如:研究生(postgraduate)是学生(student)1类之间的关系2UsesaIsahasaStrongerClassRelationshipWeakerClassRelationship类之间的关系has-A:C++中此关系使用成员变量来实现
唐僧与他的几个徒弟的关系是has-A的关系
3Has-A关系分析举例Has-A关系分析举例
class徒弟{…};class唐僧{…private:
徒弟[]徒弟们;…};4Uses-a关系Uses-A:C++中此关系使用局部变量或者和函数的参数来实现人购买车时,人与车的关系是使用关系
5Uses-a关系ClassCar{…};ClassPerson{…Public:voidbuy(Car&car){doubleprice=car.getPrice();……}…};6Is–a关系7C++中此类关系使用继承来实现交通工具“类族”之间的关系就是继承关系类之间的关系8使用面向对象的语言进行程序开发,与面向过程不同,首先应确定“类”以及这些类之间的关系,然后再为每个类添加“属性”和“方法”。这是C与C++程序设计最大的不同。对象=算法+数据结构程序=(对象+对象+对象+…)+消息2-2类的组合(Has-A)91.类的组合的声明2.类的组合的初始化Student类classDate{public:Date();Date(intd,intm,inty);~Date();voiddisplay();private:intday;intmonth;intyear;};classStudent{public:Student();~Student();voiddisplay();private:intnum;
char*name;
Datebirthday;
};类的复合(聚集)Student-num:intname:char*sex:char-birthday:Date+print():void+set():void……复杂数据成员任何一个Student对象都包含有一个birthday对象,所以,想要构造一student,就必须先构造一个birthday成员对象的初始化一个对象如果有“成员对象”(即它的成员数据不是普通类型,而是“类”类型的),那么在实现构造函数时应对“成员对象”进行初始化。方式是在构造函数中增加构造参数,指明“成员对象”构造的方式若没有“成员对象”构造方式的声明,系统默认调用“成员对象”的无参的构造函数。Student类的构造函数Student::Student(intno,char*n,chars,inty,intm,intd):birth(y,m,d){ num=no; strcpy(name,n); sex=s;cout<<"StudentConstructorcalled."<<endl;}13142-3类的继承和多态1.继承概述2.基类和派生类3.派生类的构造与析构4.多继承与虚基类5.多态概述6.虚函数7.纯虚函数与抽象类151.继承概述继承16继承是面向对象程序设计的基本特征之一,是从已有的类基础上建立新类的过程。继承性是面向对象程序设计支持代码重用的重要机制。面向对象程序设计的继承机制提供了无限重复利用程序资源的一种途径。通过C++语言中的继承机制,一个新类既可以共享另一个类的操作和数据,也可以在新类中定义已有类中没有的成员,这样就能大大的节省程序开发的时间和资源。1.继承概述17class派生类名:继承方式基类名{
数据成员和成员函数声明;}1.继承概述18继承是类之间定义的一种重要关系称已存在的用来派生新类的类为基类,又称为父类由已存在的类派生出的新类称为派生类,又称为子类。派生类可以具有基类的特性,共享基类的成员函数,使用基类的数据成员,还可以定义自己的新特性,定义自己的数据成员和成员函数。classB:classAAdata;Afunction;B_Data;B_Fuction;1.继承概述192.基类和派生类不同继承方式的影响主要体现在:派生类成员对基类成员的访问权限派生类对象对基类成员的访问权限三种继承方式公有继承私有继承保护继承20
派生类对基类成员的使用,与继承访问控制和基类中成员性质有关公有继承
基类的公有成员派生类的公有成员基类的保护成员派生类的保护成员私有继承
基类的公有成员和保护成员派生类的私有成员保护继承
基类的公有成员和保护成员派生类的保护成员不论哪种方式继承基类,派生类都不能直接使用基类的私有成员默认继承方式2.基类和派生类21基类中访问方式派生类继承方式派生类中访问基类成员publicpublicpublicprotectedpublicprotectedprivatepublic---publicprotectedprotectedprotectedprotectedprotectedprivateprotected---publicprivateprivateprotectedprivateprivateprivateprivate---2.基类和派生类221.派生类不能访问基类私有成员2.定义与派生类同名的成员
如果派生类定义了与基类同名的成员,称派生类的成员覆盖了基类的同名成员,若要在派生类中使用基类同名成员,可以显式地使用类名限定符:3.派生类中的静态成员
不管公有派生类还是私有派生类,都不影响派生类对基类的静态成员的访问,派生类对基类静态成员必须显式使用形式:类名::成员类名::成员2.基类和派生类23复制兼容规则在公有派生的情况下,一个派生类的对象可用于基类对象适用的地方。赋值兼容规则有三种情况:(1)派生类的对象可以赋值给基类的对象。
base_Obj=derived_Obj;(2)派生类的对象可以初始化基类的引用。
base&base_Obj=derived_obj;(3)派生类的对象的地址可以赋给指向基类的指针。
base*pBase=&derived_obj;2.基类和派生类243.派生类的构造与析构
构造函数与析构函数不被继承C++提供一种机制,在创建派生类对象时调用基类的构造函数来初始化基类数据。执行派生类的析构函数时,基类的析构函数也将被调用。
构造函数执行顺序:基类
派生类
析购函数执行顺序:与构造函数相反25构造函数执行顺序:基类派生类中对象成员
派生类先祖先,再客人,后自己按照类声明的顺序执行各自的构造函数派生类构造函数声明:派生类构造函数(变元表):基类(变元表),…,对象成员n(变元表);3.派生类的构造与析构26
一个类有多个直接基类的继承关系称为多继承
多继承声明语法
class派生类名
:访问控制基类名1,…,访问控制基类名n{
数据成员和成员函数声明
};4.多继承27classC:publicA,publicBclassAclassB类C可以根据访问控制同时继承类A和类B的成员,并添加自己的成员4.多继承281。同名成员的二义性不同基类中有同名函数,使用基类名可避免这种二义:
基类与派生类同名函数
这种用基类名来控制成员访问的规则称为支配原则。
voidC::f(){A::f();//B::f();}obj.A::f();obj.B::f();obj.g();//隐含用C的g()obj.B::g();//用B的g()4.多继承292。同一基类被多次继承产生的二义性
一个类不能从同一类直接继承二次或更多次。 当一个派生类是从多个基类中派生而出的,而这些派生类又有一个公共的基类的时候,有可能会出现访问的二义性。classC:publicB1,publicB2classB1classB2classB4.多继承30例如:classB{public:intb;};classB1:publicB{intb1;};classB2:publicB{intb2;};classC:publicB1,publicB2{public:intf();private:intd;};有:Cc;c.B::b;
//error,从哪里继承的?
classC{f(),d}classB1{b1}classB2{b2}classB{b}classB{b}c.B1::bc.B2::b4.多继承31例如:classB{public:intb;};classB1:publicB{intb1;};classB2:publicB{intb2;};classC:publicB1,publicB2{public:intf();private:intd;};classC{f(),d}classB1{b1}classB2{b2}classB{b}classB{b}c.bc.b1c.bc.b2c.dBBB1B2C多重派生类C的对象的存储结构示意建立C类的对象时,B的构造函数将被调用两次:分别由B1和B2调用,所以初始化C类的对象中包含的两个B类的子对象4.多继承32
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性
如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象
要使这个公共基类在派生类中只产生一个子对象,必须将这个基类声明为虚基类。
虚基类声明使用关键字 virtual4.多继承33由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。规定将在建立对象时所指定的类称为最直接派生类。虚基类子对象是由最直接派生类的构造函数通过调用虚基类的构造函数进行初始化的。从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个派生类的构造函数调用虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略。4.多继承多态性的两种描述:(1)指具有不同功能的函数可以用同一个函数名。(2)指向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。5.多态概述355.多态概述实现多态基础:复制兼容规则调用虚函数36在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。基类指针(或引用)可以引用子类对象。通过基类指针(或基类引用)来引用子类对象是实现多态的两种手段虚函数就是冠以virtual关键词的类的非静态成员函数虚函数的作用就是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。6.虚函数37如下声明的非静态成员函数:virtual函数类型函数名(形参表){
函数体}6.虚函数38虚析构函数当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。但是,如果用new运算符建立了临时派生类对象,并且定义了一个指向该基类的指针变量,指向该派生类对象。在程序用带指针参数的delete运算符撤销对象时,会发生一个情况:系统会只执行基类的析构函数,而不执行派生类的析构函数。6.虚函数397.纯虚函数与抽象类有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。例如,按理说基类Point中应该没有求面积的area函数,因为“点”是没有面积的,也就是说,基类本身不需要这个函数,所以Point类中应该不定义area函数。但是,在其直接派生类Circle和间接派生类Cylinder中都需要有area函数,而且这两个area函数的功能不同,一个是求圆面积,一个是求圆柱体表面积。也许大家认为,可以在基类Point中加一个area函数,并声明为虚函数: virtualfloatarea()const{return0;}其实,在基类中并不使用这个函数,其返回值也是没有意义的。为简化,可以不写出这种无意义的函数体,只给出函数的原型,并在后面加上“=0”,如: virtualfloatarea()const=0;//纯虚函数7.纯虚函数与抽象类41在许多情况下,在基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手机拍的协议书
- 热网管道合同范本
- 苗子培养协议书
- 蔬菜加工协议书
- 融资代扣协议书
- 认亲合同协议书
- 认购合同协议书
- 设备借货协议书
- 设备清合同范本
- 设计驻场协议书
- 骶部炎性窦道的护理
- 多元催化体系下羊毛脂转酯化制备胆固醇的工艺解析与效能探究
- 2026福建春季高考语文总复习:名篇名句默写(知识梳理+考点)原卷版
- 郑州市2025届高中毕业年级第一次质量预测数学试题及答案解析
- 学霸养成之第一性原理-2025-2026学年高二上学期学习方法指导班会
- 投资策略分析报告:波动趋势量化剥离策略
- 2025国家外汇管理局中央外汇业务中心社会在职人员招聘3人考试笔试备考题库及答案解析
- 景德镇市中医院护理疑难病例讨论组织与管理试题
- 中铁四局河沙合同范本
- 高职院校五育并举实施方案
- 美团代理加盟合同范本
评论
0/150
提交评论