虚函数和多态性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 虚函数
shape virtual draw( )
circle virtual draw( )
triangle virtual draw( )
rectangle virtual draw( )
1
绘图时,简单调用基类shape的函数draw,并让程序动态地确定 调用哪个派生类的draw函数.
在基类shape中把draw声明为虚函数: virtual void draw( ) const ;
double=0.0, int=0 ) ; void setwage(double ) ; void setquantity(int); virtual double earnings( ) const ; virtual void print( ) const ; }
13
#include<employee.h> class hourlyworker :public employee
shape
twoDshape
threeDshape
circle
square
triangle
sphere
3
如果把带有虚函数的类中的一个或多个虚函数声明为纯虚函 数,则该类就成为抽象类.
纯虚函数:声明“初始化值为0”. 例, virtual float earnings( ) const=0; 类层次结构中可以不包含抽象类;但良好的面向对象系统,其 类层次结构顶部是一个抽象基类.
6
C++的多态性:
派生类的对象亦是基类的对象.
quadrilateral
rectanห้องสมุดไป่ตู้le
基类
派生类
对quadrilateral的对象的操作也能用在 rectangle的对象上.
通过定义虚函数实现: quadrilateral q, *pq ; rectangle r, *pr ; pr=&r ; pq=pr; pq->perimeter();
void setweeksalary(double ) ; virtual double earnings( ) const ; virtual void print( ) const ; }
11
#include<employee.h> class commissionworker :public employee { private:
worker
worker hourly worker
9
#define EMPLOYEE_H class employee { private:
char * firstname ; char * lastname ; public: employee(const char *,const char *) ; employee( ) ; const char * getfirstname( ) const ; const char * getlastname( ) const ; virtual double earnings( ) const=0;
12
#include<employee.h> class pieceworker :public employee { private:
double wageperpiece ; double commission ; int quantity ; public: commissionworker(const char *,const char *,
// pure virtual function virtual void print( ) const ; }
10
#include<employee.h> class boss :public employee { private:
double weeklysalary ; public:
boss(const char *,const char *, double=0.0) ;
}
5
多态(polymorphism): 某一论域中的元素可以有多种解释.
名: 一名多用,一名指称不同的对象; +: 整数加,实数加,集合并等
值: 一个值可以有多种类型. 函数模板,类属 binary_tree(generic type T) ; begin …….. end ; binary_tree(integer);
double salary ; double commission ; int quantity ; public: commissionworker(const char *,const char *,
double=0.0, double=0.0, int=0 ) ; void setsalary(double ) ; void setcommission(double); void setquantity(int); virtual double earnings( ) const ; virtual void print( ) const ; }
在每个类派生类中重新定义draw,使之能够绘画自已的图形. 在程序执行时,用基类指针shapeptr指向派生类对象,用 shapeptr ->draw( )调用draw,则程序会动态地选择该派生类对象的 函数draw(称为动态绑定).
2
2. 抽象类和具体类 抽象类(abstract class) 不建立实例化对象; 为其它类提供基类. 具体类(concrete class) 能建立实例化对象. 例: 图的层次
4
3.多态性 多态一词是C.Strachey在60年引入的,用以刻划多态函数,即函数的参
数可以取多种类型. 例: fun idet(x)=x
函数模板: template<class T> T max (T x , T y)
{ T t; if (x>y) t=x; else t=y; return (t);
7
多态例: 屏幕管理程序
shape virtual draw( )
circle virtual draw( )
triangle virtual draw( )
rectangle virtual draw( )
8
4. 实例:利用多态性的工资单系统
employee
抽象基类
boss
commission piecework
shape virtual draw( )
circle virtual draw( )
triangle virtual draw( )
rectangle virtual draw( )
1
绘图时,简单调用基类shape的函数draw,并让程序动态地确定 调用哪个派生类的draw函数.
在基类shape中把draw声明为虚函数: virtual void draw( ) const ;
double=0.0, int=0 ) ; void setwage(double ) ; void setquantity(int); virtual double earnings( ) const ; virtual void print( ) const ; }
13
#include<employee.h> class hourlyworker :public employee
shape
twoDshape
threeDshape
circle
square
triangle
sphere
3
如果把带有虚函数的类中的一个或多个虚函数声明为纯虚函 数,则该类就成为抽象类.
纯虚函数:声明“初始化值为0”. 例, virtual float earnings( ) const=0; 类层次结构中可以不包含抽象类;但良好的面向对象系统,其 类层次结构顶部是一个抽象基类.
6
C++的多态性:
派生类的对象亦是基类的对象.
quadrilateral
rectanห้องสมุดไป่ตู้le
基类
派生类
对quadrilateral的对象的操作也能用在 rectangle的对象上.
通过定义虚函数实现: quadrilateral q, *pq ; rectangle r, *pr ; pr=&r ; pq=pr; pq->perimeter();
void setweeksalary(double ) ; virtual double earnings( ) const ; virtual void print( ) const ; }
11
#include<employee.h> class commissionworker :public employee { private:
worker
worker hourly worker
9
#define EMPLOYEE_H class employee { private:
char * firstname ; char * lastname ; public: employee(const char *,const char *) ; employee( ) ; const char * getfirstname( ) const ; const char * getlastname( ) const ; virtual double earnings( ) const=0;
12
#include<employee.h> class pieceworker :public employee { private:
double wageperpiece ; double commission ; int quantity ; public: commissionworker(const char *,const char *,
// pure virtual function virtual void print( ) const ; }
10
#include<employee.h> class boss :public employee { private:
double weeklysalary ; public:
boss(const char *,const char *, double=0.0) ;
}
5
多态(polymorphism): 某一论域中的元素可以有多种解释.
名: 一名多用,一名指称不同的对象; +: 整数加,实数加,集合并等
值: 一个值可以有多种类型. 函数模板,类属 binary_tree(generic type T) ; begin …….. end ; binary_tree(integer);
double salary ; double commission ; int quantity ; public: commissionworker(const char *,const char *,
double=0.0, double=0.0, int=0 ) ; void setsalary(double ) ; void setcommission(double); void setquantity(int); virtual double earnings( ) const ; virtual void print( ) const ; }
在每个类派生类中重新定义draw,使之能够绘画自已的图形. 在程序执行时,用基类指针shapeptr指向派生类对象,用 shapeptr ->draw( )调用draw,则程序会动态地选择该派生类对象的 函数draw(称为动态绑定).
2
2. 抽象类和具体类 抽象类(abstract class) 不建立实例化对象; 为其它类提供基类. 具体类(concrete class) 能建立实例化对象. 例: 图的层次
4
3.多态性 多态一词是C.Strachey在60年引入的,用以刻划多态函数,即函数的参
数可以取多种类型. 例: fun idet(x)=x
函数模板: template<class T> T max (T x , T y)
{ T t; if (x>y) t=x; else t=y; return (t);
7
多态例: 屏幕管理程序
shape virtual draw( )
circle virtual draw( )
triangle virtual draw( )
rectangle virtual draw( )
8
4. 实例:利用多态性的工资单系统
employee
抽象基类
boss
commission piecework