面向对象程序设计( C++ ) 高职软件专业 王明福 课件 第7章 多态性和虚函数.ppt
文本预览下载声明
尚辅网 尚辅网 7.1 静态联编和动态联编 联编分为静态联编和动态联编。 在编译阶段决定执行哪个同名函数被调用,这称为静态联编; 而在编译阶段不能决定执行哪个同名函数被调用,只有在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数,称为动态联编。 【例7-1】以下是一个静态联编的例子,分析程序的执行结果。 #include iostream.h class point { int x,y; public: point( int x1,int y1) { x=x1;y=y1; } int area( ) { cout点的面积为:; return 0; } }; class Rect: public point { int l,w; public: Rect( int x1,int y1,int l1,int w1): 7.2 虚函数和抽象类 7.2.1 虚函数的定义 虚函数的定义方法如下 总结动态联编的实现需要如下三个条件 7.2.2 纯虚函数 纯虚函数的声明格式如下: 7.2.3 抽象类 带有纯虚函数的类称为抽象类。抽象类不能产生对象。 7.3 应用实例 【例7-5】编写一个程序计算正方形、球体和圆柱体的表面积和体积。 类container 纯虚函数说明: surface_area(),volume()类cube 纯虚函数实现: surface_area(),volume()类sphere 纯虚函数实现: surface_area(),volume()类cylinder 纯虚函数实现: surface_area(),volume()图7-2 类层次 (3) 由抽象基类,派生出要描述的正方形、球体和圆柱体3个类,即cube、sphere和cyliner,在这3个类中都具有求表面积和体积的重定义版本。 习题七 1. 什么是多态性?如何实现多态性? 2. 设有如下的类层次结构: struct A { int b; void fun(int); }; struct B : A { void b(); void fun(double); }; struct C : A, B{ }; 定义对象 B b; C c; 后,下面的语句各能访问哪些成员?为什么? (1)b.b(); (2)b.fun(); (3)c.b(); (4)c.fun(5); 如果把上面的struct都改为class,类层次结构应如何修改? * 尚辅网 第7章 多态性和虚函数 本章要点 通过本章的学习,使读者: ? 了解静态联编和动态联编的概念 ? 掌握虚拟函数的声明、定义方法和访问属性 ? 理解纯虚函数和抽象类的概念,掌握纯虚函数和抽象类的定义方法 尚辅网 尚辅网 尚辅网 point (x1,y1) { l=l1; w=w1; } int area( ) { return (l*w); } }; void fun (point p) { cout p.area( ) endl; } void main( ) { Rect rec(2,4,10,6); fun(rec); } 程序运行结果如下 : 点的面积为:0 尚辅网 virtual 函数类型虚函数名(参数列表); ① 类的静态成员函数不可以定义为虚函数。 ② 类的构造函数不可以定义为虚函数。 ③ 非类的函数不可以定义为虚函数。 定义虚函数要遵循的规定 尚辅网 (1) 要有说明的虚函数。 (2) 调用虚函数操作的是指向对象的指针或者对象引用。 (3) 由成员函数调用虚函数。 尚辅网 virtual 函数类型虚函数名(参数表)= 0; 纯虚函数不可以被直接调用,也不可以被继承。 尚辅网 ·抽象类只能用作其他类的基类,不能建立抽象类对象。 ·抽象类不能用作参数类型、函数返回类型或显式转换的类型。 ·可以说明指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。 对于抽象类的使用有几点规定 尚辅网 编程要点: (1) 从正方形、球体和圆柱体的各种运算中抽象出一个公共基类container为抽象基类。 (2) 在抽象基类中,定义求表面积和体积的2个纯虚函数。抽象类中定义一个公共的数据成员radius,可作为球的半经、正方体边长、圆柱体的底面半经。 尚辅网 尚辅网 类container 纯虚函数说明: surface_area
显示全部