文档详情

第7章-多态性与虚函数.ppt

发布:2018-06-18约6.22千字共33页下载文档
文本预览下载声明
* 3、把至少包含一个纯虚函数的类,称为抽象类。这种类只能作为派生类的基类,不能用来说明这种类的对象。 其理由是明显的:因为虚函数没有实现部分,所以不能产生对象。但可以定义指向抽象类的指针,即指向这种基类的指针。当用这种基类指针指向其派生类的对象时,必须在派生类中重载纯虚函数,否则会产生程序的运行错误。 多态性与虚函数 * 虚函数 多态性:调用同一个函数名,可以根据需要但实现不同的功能。 多态性是面向对象的程序设计的关键技术。 编译时的多态性(函数重载) 运行时的多态性(虚函数) 多态性 运行时的多态性是指在程序执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定 * 可以将一个派生类对象的地址赋给基类的指针变量。 基类对象 派生类对象 Base b; Derive d; Base *basep; basep basep=b; basep basep = d; basep只能引用从基类继承来的成员。 x Show() x Show() y Show() basep -Show(); basep-Show() 基类指针 派生类对象 基类对象 * class Point{ float x,y; public: Point(){} Point(float i,float j){ x=i; y=j; } float area( ) { return 0.0; } }; const float Pi=3.14159; class Circle:public Point{ //类Point的派生类 float radius; public: Circle(float r){ radius=r; } float area( ) { return Pi*radius*radius; } }; void main( ) { Point *pp; //基类指针,可以将派生类对象的地址赋给基类指针 Circle c(5.4321); pp=c; coutpp-area ()endl; //调用的是基类中有的公有函数 } 在基类和派生类中具有相同的公有函数area()。 在这种情况下,使用基类的指针时,只能访问从相应基类中继承来的成员,而不允许访问在派生类中增加的成员。输出为 0 * 基类对象 派生类对象 Base b; Derive d; basep basep x Show() x Show() y Show() basep-Show() Base *basep; basep=b; basep = d; basep -Show(); 即指向派生类新增的成员函数 需要将基类中的Show()说明为虚函数 * 若要访问派生类中相同名字的函数,必须将基类中的同名函数定义为虚函数,这样,将不同的派生类对象的地址赋给基类的指针变量后,就可以动态地根据这种赋值语句调用不同类中的函数。 * class Point{ float x,y; public: Point(){} Point(float i,float j){ x=i; y=j; } virtual float area( ) { return 0.0; } }; const float Pi=3.14159; class Circle:public Point{ //类Point的派生类 float radius; public: Circle(float r){ radius=r; } float area( ) { return Pi*radius*radius;} }; void main( ) { Point *pp; //基类指针,可以将派生类对象的地址赋给基类指针 Circle c(5.4321); pp=c; coutpp-area ()endl; //调用虚函数 } 将area()声明为虚函数,编译器对其进行动态关联,按照实际对象c调用了Circle中的函数area()。使Point类中的area()与Circle类中的area()有一个统一的接口。 输出:92.7011 声明为虚函数 调用虚函数 虚函数再定义 * 虚函数的定义和使用 可以在程序运行时通过调用相同的函数名而实现不同功能的函数称为虚函数。定义格式为: virtual type FuncName(ArgList); 一旦把基类的成员函数定义为虚函数,由基类所派生出来的所有派生类中,该函数均保持虚函数的特性。 在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员
显示全部
相似文档