C++程序设计中:指具有不同功能的函数可以用同一个函数名
面向对象方法中:多态性是指发出同样的消息,不同类型的对象接收时会产生不同的行为。
可以通过函数的重载,运算符的重载,虚函数实现
从系统实现的角度看,多态性分为两类:
静态关联与动态关联
虚函数
//通过各自对象调用函数
int main()
{ Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.5,563.5);
stud1.display();
grad1.display();
}
//通过各自指针调用函数
int main()
{ Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.5,563.5);
Student *pt;
pt=&stud1;
pt->display();
Graduate *ptr;
ptr=&grad1;
ptr->display();
}
每个派生类都有同名的 display()函数,需要定义多个指向各派生类的指针。太麻烦了,虚函数通过指向基类的指针调用函数
int main()
{ Student stud1(1001,"Li",87.5);
Graduate grad1(2001,"Wang",98.5,563.5);
Student *pt; //定义pt为指向基类的指针
pt=&stud1; //pt指向基类对象
pt->display();
pt=&grad1; //pt为指向派生类对象
pt->display();
return 0;
}
允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同反应。
虚函数的使用方法:
虚析构函数
构造函数不能声明为虚函数。
class Point
{public:
Point(){}
~Point(){cout<<"executing Point destructor"<<endl;}
};
class Circle:public Point
{public:
Circle(){}
~Circle(){cout<<"executing Circle destructor"<<endl;}
private:
int radius;
};
int main()
{Point *p=new Circle;
delete p;//executing Point destructor
return 0;
}
如果希望执行派生类Circle的析构函数,可以将基类的析构函数声明为虚析构函数virtual ~Point()
当基类的析构函数为虚函数时,无论指针指的是同一类族中哪一个类的对象,当对象撤销时,系统会采用动态关联,调用相应的析构函数,对该对象进行清理工作。
如果基类中的函数被声明为 virtual
,那么在派生类中即使没有再写 virtual
,它也仍然是虚函数
纯虚函数与抽象类
纯虚函数指在声明虚函数时被“初始化”为0的函数。形如,virtual 函数类型 函数名(参数列表)=0;
如,virtual double area() =0;
或,virtual double area() const =0;
抽象类:不是用来定义对象而只作为一种基本类型用作继承的基类。
凡是包含纯虚函数的类都是抽象类。
抽象类不能定义对象,但可以定义指向抽象类的指针。