面向对象的程序设计13.ppt_第1页
面向对象的程序设计13.ppt_第2页
面向对象的程序设计13.ppt_第3页
面向对象的程序设计13.ppt_第4页
面向对象的程序设计13.ppt_第5页
已阅读5页,还剩16页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

5 Polymorphism(2),Object-Oriented Programming in C+,计算机科学与技术学院 刘培强 http:/liupqT,2010-2011-01 电信08 计科09,1/20,Content,5.3 Name Overloading, Name Overriding, and Name Hiding 5.4 Abstract Base Classes 5.5 Run-Time Type Identification Sample: Shape Hierarchy Sample: List, Queue, Stack,2/20,5.3 Name overloading, overriding, hiding,Name overloading (重载、过载) Top-level functions can share a name if they have different signatures(签名). Methods in the same class can share a name if they have different signatures.,class C public: C( ) / default constructor C( int x ) / convert constructor ; void print( double d ); void print( char * ); int main( ) C c1, c2(26); print( 100.123); print( “100.123” ); ,编译过程中绑定函数调用和对应的函数体,3/20,5.3 Name overloading, overriding, hiding,Name overriding (重置、覆盖) 若基类方法 B:m 和派生类方法 D:m 具有相同的函数签名,且基类方法 B:m 是 virtual 方法,则 D:m 重置了 B:m。 当通过基类指针或引用访问被重置的方法 m 时,需要运行时动态绑定。,class B public: virtual void m( ) ; class D : public B public: void m ( ) ;,重置了基类方法,仍然为虚函数,int main( ) B* p = new D; p - m( ); / 动态绑定 D:m() return 0; ,virtual,静态绑定B:m(),4/20,5.3 Name overloading, overriding, hiding,Name hiding (隐藏) 若基类 B 定义了非虚方法 m,同时其派生类 D 也定义了方法m,此时,我们说派生类方法 D:m 隐藏了继承自基类的同名方法 B:m 。,class B public: void m( int x ) ; class D : public B public: void m ( ) ;,int main( ) D d1 ; d1.m( ); / invokes D:m() d1.m( 10 ); / ERROR return 0; ,d1.B:m(10); / OK,5/20,5.3 Name overloading, overriding, hiding,Name hiding and virtual method,class B public: virtual void m( int x ) ; class D : public B public: virtual void m ( ) ;,int main( ) D d1 ; d1.m( ); / invokes D:m() d1.m( 10 ); / ERROR return 0; ,由于函数签名不同,所以二者不构成重置。 故D:m隐藏了B:m。,d1.B:m(10); / OK,6/20,5.3 Name overloading, overriding, hiding,函数同名的一般理由如下: 以Top-level函数形式定义时,形成过载,表示他们完成相同的概念操作; 同一个类中的非构造函数,若同名则形成过载,表示他们完成相同的概念操作; 一个类存在多个构造函数:default constructor, copy constructor, convert constructer, 在一个类继承层次中,为支持方法多态,由基类定义虚函数,在派生类中重新定义重置。,7/20,内容回顾,基类中定义虚方法的目的:为了支持方法多态,同时表明:虚方法是同一族类所具有的共同接口(Interface),且其语义与类型相关。,class BC public: virtual void f( ); ; class DC : public BC public: void f( ); ;,BC* pb = new BC; pb - f(); / BC:f pb = new DC; pb - f(); / DC:f,1,2,2,3,派生类重置基类的虚方法,通过基类指针或引用访问虚方法,8/20,内容回顾,派生类可以不重置基类的虚方法,也能表明它具有基类的对外接口(Interface)。,class BC public: virtual void f( ); ; class DC : public BC public: void f( ); ;,BC* pb = new BC; pb - f(); / BC:f pb = new DC; pb - f(); / DC:f,1,2,2,3,派生类重置基类的虚方法,通过基类指针或引用访问虚方法,/ Not has f( );,BC:f,9/20,内容回顾,在实际应用中,有时候要求派生类必须重置基类虚方法。,class Animal public: virtual void speak( ) ? ;,现实中不存在Animal的实例,也没有相同的Language,class Bull : public Animal public: void speak( ) cout “Moo!” endl; ;,class Dog : public Animal public: void speak( ) cout “Woof!” endl; ;,10/20,Abstract Base Classes(抽象基类),An abstract class is abstract in that no objects can instantiate it. 充要条件:至少有一个纯虚(pure virtual)方法. A pure virtual method is one whose declaration ends with the special syntax =0.,class Animal public: virtual void speak( ) = 0; ; Animal obj; / ERROR,11/20,Abstract Base Classes(抽象基类),抽象类通常有派生类没有派生类的抽象类是多余的. 派生类可以不重置基类的纯虚函数,此时派生类也是一个抽象类(不可能有实例)。,class Animal public: virtual void speak( ) = 0; ; Animal obj; / ERROR,class FourLegsAnimal : public Animal public: /virtual void speak( ) = 0; ; FourLegsAnimal obj; / ERROR,12/20,Abstract Base Classes(抽象基类),抽象类特征: 可以有多个(1)纯虚方法; 可以有非纯虚方法; 可以有非虚方法; 可以有数据成员; 可以定义成员的访问控制(对外能见度)。,所有类的特点,class ABC public: ABC( ) ABC(int x) ABC( ) virtual void open( ) = 0; virtual void print() int getCount( ) private: int n; ,13/20,Abstract Base Classes(抽象基类),抽象类用途 抽象基类用来说明一族类的共同接口(shared interface).,BasicFile,InFile,OutFile,class BasicFile public: virtual int open( ) =0; virtual int close( ) =0; virtual int flush( ) = 0; ;,class InFile : public BasicFile public: virtual int open( ) ; virtual int close( ) ; virtual int flush( ) ; ;,class OutFile : public BasicFile public: virtual int open( ) ; virtual int close( ) ; virtual int flush( ) ; ;,14/20,Abstract Base Classes(抽象基类),抽象类用途 抽象类可以用来表明某种软件设计需求。,class IIntroSpect public: virtual void listFields ( ) =0; virtual void listMethods( ) =0; ;,class MyClass / 有实例的类 : public IIntroSpect public: void listFields ( ) ; void listMethods( ) ; / other members of MyClass ;,15/20,应用举例 Shape(形状) hierarchy,所有图形的部分共性: Draw (显示) Resize (改变大小) Move (移动),16/20,应用举例 Shape(形状) hierarchy,Shape,Point,Line,Circle,Triangle,Rectangle,RealLine,DashLine,Ellipse,所有图形的共性定义在基类Shape中,17/20,class Shape public: virtual void Draw ( ) =0; virtual void Move (double dx, double dy ) =0; virtual void Resize ( double rate ) =0; virtual Shape() / ;,class Point : public Shape public: Point( double vx =0, double vy =0) : x(vx), y(vy) void Draw ( ) void Move ( double dx, double dy ) x += dx; y += dy; void Resize(double rate) private: double x, y; ;,18/20,class Shape public: virtual void Draw ( ) =0; virtual void Move (double dx, double dy ) =0; virtual void Resize ( double rate ) =0; virtual Shape() / ;,class Line : public Shape public: Line( Point l, Point r ) : Left(l), Right(r) /virtual void Draw ( ) =0; void Move (double dx, double dy ) Left.Move(dx, dy); Right.Move(dx, dy); void Resize(double rate) private: Point Left, Right; / other members of Line ;,class DashLine : public Line public: void Draw ( ) / Move( ) 无需重置 / Resize( ) 无需重置 ;,19/20,class Shape public: virtual void Draw ( ) =0; virtual void Move (double dx, double dy ) =0; virtual void Resize ( double rate ) =0; virtual Shape() / ;,class PaintApp /绘图程序 public: void G

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论