版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中科研CASoft软件工程师培训讲义Game
Master游戏修改工具第2讲从C到C++(2)中科天地软件人才培训中心Created
by本讲重点提要继承与派生多态性继承与派生类描述了一组有相同特性(数据元素)和相同行为(函数)的对象。类实际上就是数据类型,例如,浮点数也有一组特性和行为。区别在于程序员定义类是为了与具体问题相适应,而不是被迫使用已存在的数据类型。类型不仅仅说明一组对象上的约束,还说明与其他类
型之间的关系。两个类型可以有共同的特性和行为,
但是,一个类型可能包括比另一个类型更多的特性,
也可以处理更多的消息(或对消息进行不同的处理)。继承表示了基本类型和派生类型之间的相似性。一个
基本类型具有所有由它派生出来的类型所共有的特性
和行为。程序员创建一个基本类型以描述系统中一些
对象的思想核心。由这个基本类型派生出其他类型,
表达了认识该核心的不同途径。继承与派生比如设计一个类来表示“形体”,每个
形体有大小、颜色、位置等。每个形体
能被绘制、擦除、移动、着色等。由此,可以派生出特殊类型的形体:圆、正方
形、三角形等,它们中的每一个都有另
外的特性和行为,例如,某些形体可以
翻转。有些行为可以不同(计算形体的
面积)。类型层次结构既体现了形体间
的类似,又体现了它们之间的区别。继承与派生基本概念保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类。继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。继承与派生派生类的定义方法class
派生类名:继承方式(public/private/protected)基类名1,基类名2,
….{成员定义;}多继承:一个派生类有多个基类;单继承:一个派生类只有一个基类。public指明了基类是一公有基类,也可以用private来指明基类为一私有基类用户没有指明private或public时,系统默认为private继承与派生共有三种继承方式:公有继承(public),私有继承(private),保护继承(protected)。继承方式指定派生类成员以及类外对象对继承来的成员的访问权限。不同继承方式的影响主要体现在:派生类成员对基类成员的访问控制。派生类对象对基类成员的访问控制。继承与派生公有继承基类的public和protected成员的访问属性在派生类中保持不变,但基类的
private成员不可访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的
private成员。派生类的对象只能访问基类的public成员。继承与派生私有继承基类的public和protected成员都以
private身份出现在派生类中,但基类的
private成员不可访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的
private成员。派生类的对象不能访问基类中的任何成员。继承与派生保护继承基类的public和protected成员都以
protected身份出现在派生类中,但基类的private成员不可访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的
private成员。派生类的对象不能访问基类中的任何成员。继承与派生访问权限的派生传递关系派生类private
private基类public派生类作用区域外privatepublic派生类作用区域内不可见不可见不可见protectedpublicprotected
privatepublic
publicprivateprivate派生类作
派生类作用区域内
用区域外不可见不可见不可见继承与派生继承时的构造函数基类的构造函数不被继承,需要在派生类中自行定义。定义构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化由基类的构造函数完成。但派生类构造函数的定义中,要提供基类构造函数所需要的参数。单一继承时的构造函数派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数){本类成员初始化赋值语句;};–
如:C::C(int
i,int
j):B(I)继承与派生多继承时的构造函数派生类名::派生类名(基类1形参,基类2形参,...基类n形参,本类形参):基类名1(参数),基类名2(参数),...基类名n(参数){本类成员初始化赋值语句;};当基类中定义有缺省形式的构造函数或未定义构造函数时,派生类构造函数的定义中可以省略对基类构造函数的调用若基类中未定义构造函数,派生类中也可以不定义,全采用缺省形式构造函数。当基类定义有带形参的构造函数时,派生类也应定义构造函数,提供将参数传递给基类构造函数的途径。继承与派生构造函数的调用次序调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。派生类的构造函数体中的内容。继承与派生继承时的析构函数析构函数也不被继承,派生类自行定义。定义方法与一般(无继承关系时)类的析构函数相同。不需要显式地调用基类的析构函数,系统会自动隐式调用。析构函数的调用次序与构造函数相反。继承与派生派生类与基类的关系赋值兼容原则一个公有继承的派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以被赋值给基类对象。派生类的对象可以初始化基类的引用。指向派生类及基类对象的指针以public方式继承时,指向基类的指针也可以指向派生类。通过指向基类对象的指针可以指向它的公有派生的对象,但不能指向私有派生的对象;这种指针只能访问从基类中继承的公有成员,不能访问派生类本身的成员;但不能将一个派生类对象的指针指向其基类对象。继承与派生二义性问题在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)——采用虚函数或支配(同名覆盖)原则来解决。当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性——采用虚基类来解决。虚基类虚基类的引入用于有共同基类的场合定义以virtual修饰说明基类例:class
B1:virtual
public
B作用主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题.为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝注意:在第一级继承时就要将共同基类设计为虚基类。多态性多态性(Polymorphism)多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时导致完全不同的行为。多态的实现:函数重载运算符重载虚函数多态性:运算符重载运算符重载运算符重载是对已有的运算符赋予多重含义必要性C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)实现机制运算符重载的实质就是函数重载:每个运算符对应各自的运算符函数,根据操作数的不同调用不同的同名函数。将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。多态性:运算符重载运算符重载的规则和限制编译系统对重载运算符的选择,遵循函数重载的选择原则。可以重载C++中除下列运算符外的所有运算符:.
.*
::
?:只能重载C++语言中已有的运算符,不可臆造新的。不改变原运算符的优先级和结合性。不能改变操作数个数。经重载的运算符,其操作数中至少应该有一个是自定义类型。多态性:运算符重载运算符重载的两种形式重载为类的成员函数:函数类型operator
运算符(形参表){
函数体
}重载为类的友元函数:friend
函数类型operator
运算符(形参表){
函数体
}多态性:运算符重载重载为类成员函数时参数个数=原操作数个数-1
(后置++、--除外)当类的对象调用这种运算符函数时,对象中的成员数据就可以是一个操作数,另一个操作数才通过参数传递来获得。如:class
complex{publiccomplex
operator
+
(complex
c2);…….
}多态性:运算符重载重载为友元函数时参数个数=原操作数个数,且至少应该有一个自定义类型的形参。友元函数是类以外的函数,调用这种运算符函
数时,所有的操作数都要通过参数传递来获得。如:class
complex{publicfriend
complex
operator
+
(complex
c1,complex
c2);…….
}多态性:运算符重载双目运算符B如果要重载B
为类成员函数,使之能够实现表达式oprd1
B
oprd2,其中oprd1
为A
类对象,则B
应被重载为A
类的成员函数,形参类型应该是oprd2所属的类型。经重载后,表达式oprd1
B
oprd2
相当于oprd1.operator
B(oprd2)多态性:运算符重载范例:将“+”、“-”运算重载为复数类的成员函数。规则:实部和虚部分别相加减。操作数:两个操作数都是复数类的对象。多态性:运算符重载复数类的实现:class
complex{public://复数类声明//外部接口complex(double
r=0.0,double
i=0.0){real=r;imag=i;}//构造函数/+重载为成员函数//-重为载成员函数//输出复数//私有数据成员//复数实部//复数虚部complex
operator
+
(complex
c2);complex
operator-
(complex
c2);void
display();private:double
real;double
imag;};多态性:运算符重载重载运算符函数的实现complex
complex::operator
+(complex
c2){complex
c;c.real=c2.real+real;c.imag=c2.imag+imag;return
complex(c.real,c.imag);}complex
complex::operator
-
(complex
c2){complex
c;c.real=real-c2.real;c.imag=imag-c2.imag;return
complex(c.real,c.imag);}多态性:运算符重载练习:使用前面实现的复数类及重载的运算符创建一个基于控制台的应用程序,接受用户输入的复数(分别输入实部和虚部),实现复数的加减运算。多态性:运算符重载前置单目运算符U如果要重载U
为类成员函数,使之能够实
现表达式U
oprd,其中oprd
为A类对象,则U
应被重载为A
类的成员函数,无形参。经重载后,表达式U
oprd
相当于a.operator
U()多态性:运算符重载后置单目运算符++和--如果要重载
++或--为类成员函数,使之能够实现表达式oprd++或
oprd--,其中
oprd为A类对象,则
++或--
应被重载为A
类的成员函数,且具有一个
int
类型形参。经重载后,表达式oprd++
相当于oprd.operator
++(0)多态性:运算符重载运算符友元函数的设计如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以此将运算符重载为该类的友元函数。函数的形参代表依自左至右次序排列的各操作数。后置单目运算符++和--的重载函数,形参列表中要增加一个int,但不必写形参名。静态联编与动态联编静态联编与动态联编:由于同名对象的多态性,程序在执行时需要确定具体的操作对象,即具体决定调用哪个函数。这种程序自身彼此关联的过程,称为联编。用来确定程序中的操作调用与执行该操作的代码间的关系。联编可以在编译时完成,也可在运行时完成,分别称为静态联编和动态联编。多态性:虚函数概念:虚函数是动态联编的基础。是非静态的成员函数。具有继承性,基类中定义了虚函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论