一、多态性
1、概念
在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名。
面向对象方法中是这样表达多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。
消息—就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
例如函数的重载、运算符的重载都是多态现象。
多态性可以分成两类:静态多态性和动态多态性;之前学过的函数重载就是静态的。动态多态性是在程序运行过程中才动态确认操作所针对的对象。动态多态性是通过虚函数实现的。
2、典型例子
(1)建立一个点的类
#include <iostream>
using namespace std;
class Point //点Point类
{
public:
Point(float x=0,float y=0); //有默认参数的构造函数
void setPoint(float,float); //设置坐标值
float getX() const {
return x;} //读x坐标
float getY() const {
return y;} //读y坐标
friend ostream & operator << (ostream &,const Point&);//重载运算符“<<”
protected: //受保护成员
float x,y;
};
//下面定义Point类的成员函数
//Point的构造函数
Point::Point(float a,float b) //对x,y初始化
{
x = a;
y = b;
}
//设置x和y的坐标值
void Point::setPoint(float a,float b) //对x,y赋新值
{
x = a;
y = b;
}
//重载运算符“<<”,使之能输出点的坐标
ostream & operator << (ostream& output,const Point& p)
{
output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
int main()
{
Point p(3.5,6.5); //建立Point类对象p
cout<<"x ="<<p.getX()<<",y ="<<p.getY()<<endl; //输出p的坐标值
p.setPoint(8.5,6.7); //重新设置p的坐标值
cout<<"p(new):"<<p<<endl; //用重载运算符“<<”输出p点坐标
}
(2)在上面的基础上添加直接派生类圆
//声明派生类Circle(圆)
class Circle:public Point //circle是Point类的公用派生类
{
public:
Circle(float x=0,float y=0,float r= 0);//构造函数
void setRadius(float); //设置半径值
float getRadius() const; //读取半径值
float area() const; //计算圆面积
friend ostream & operator << (ostream&, const Circle&);//重构运算符“<<”
protected:
float radius;
};
//定义构造函数,对圆心坐标和半径初始化
Circle::Circle(float a,float b,float r):Point(a,b),radius(r) {
}
//设置半径
void Circle::setRadius(float r)
{
radius = r;}
//读取半径值
float Circle::getRadius() const {
return radius;}
//计算圆面积
float Circle::area() const
{
return 3.14159*radius*radius;}
//重载运算符“<<”使之按规定的形式输出圆的信息
ostream & operator << (ostream& output, const Circle& c)
{
output<<"Center=["<<c.x<<","<<c.y<<"],r="<<c