清华大学Polymorphism_C++多态.doc
文本预览下载声明
第九讲 多态性
概念
多态性概述:
面向对象的继承性特征较客观的反应了类与类之间的层次关系。多态性则是讨论这种不同层次的类以及一个类的内部,类的同名成员函数之间的关系问题,是解决功能和行为的再抽象问题。多态性是指类中同一函数名对应多个具有相似功能的不同函数,可以使用相同的调用方式来调用这些具有不同功能的同名函数的特性。
多态的实现方式
静态联编:静态联编(Static Binding)是指在编译阶段完成的联编方式。在编译过程中,编译系统可以根据参数类型和参数数量的不同来确定调用哪一个同名函数。又称为早期联编或前联编。
静态联编的主要特点:
●函数调用速度快
●效率高
●不足之处是编程不够灵活。
函数重载和运算符重载是通过静态联编方式实现的编译时多态的体现。
【例1】 静态联编举例。
#include iostream.h
class Undergraduate
{public:
void Display() { coutCall BaseClassendl; coutUnergraduate LiMingendl; }
};
class Master:public Undergraduate
{ public:
void Display() { coutCall MasterClassendl; coutMaster WangWeiendl; }
};
class Doctor:public Master
{ public:
void Display() { coutCall DoctorClassendl; coutDoctor ZhangHuaendl; }
};
void main()
{ Undergraduate s1,*pointer; //定义基类对象s1和指向基类的指针
Master s2; //定义派生类对象s2
Doctor s3; //定义派生类对象s3
pointer=s1; //指针pointer指向基类对象s1
pointer-Display();
pointer=s2; //指针pointer指向基类对象s2
//期望调用对象s2的函数display(),但实际执行却调用了对象s1的输出函数
pointer-Display();
pointer=s3;
//期望调用对象s3的函数display(),但实际执行却调用了对象s1的输出函数
pointer-Display();
}
Dynamic Binding)。动态联编又称为:晚期联编或后联编。
动态联编的主要特点包括:
●使编程更具灵活性
●对问题的抽象更方便
●程序的易维护性更好
●静态联编相比,函数调用速度慢
在C++中,动态联编是通过继承和虚函数来实现。
虚函数
虚函数是动态联编的主要实现方式,是动态联编的基础。
虚函数是非静态的成员函数,经过派生之后,虚函数在类族中可以实现运行时多态。
虚函数的声明
虚函数是一个在基类中通过virtual声明,并在一个或多个派生类中被重新定义的成员函数。声明虚函数的格式如下:
virtual 返回值类型 函数名(参数表)
{
函数体;
}
虚函数实际上是一个在类的声明中使用关键字virtual来限定的成员函数;
成员函数一旦被声明为虚函数,则无论该类被继承了多少层,在各层次的派生类中,该函数都保持虚函数的特性;
在派生类中重新定义该函数时,可以省略关键字virtual。
实现动态联编方式的前提:
●先要声明虚函数
●类之间满足赋值兼容规则
●通过指针与引用来调用虚函数
【例2】 通过对象指针调用虚函数实现动态联编。
#include iostream.h
class Undergraduate
{ public:
virtual void Display() { coutCall BaseClassendl; coutUnergraduate LiMingendl; }
};
class Master:public Undergraduate
{ public:
virtual void Display() { coutCall MasterClassendl; coutMaster WangWeiendl; }
};
class Doctor:public Master
{ public:
virtual void Display() { coutCall DoctorClassendl;
显示全部