抽象类
类是对象的集合,类是从相似对象中抽取共性而得到的抽象数据类型
将不用来声明对象(实例化)的类称为抽象类,只供继承使用
-
纯虚函数的定义如下:
virtual 返回类型 函数名(参数表)= 0
- 具体实现只能在派生类中完成
-
抽象类又可以定义成:
- 至少包含一个纯虚函数的类
抽象类的使用要求
- 抽象类不能实例化,即不声明对象
- 抽象类只作为基类被继承
- 可以定义抽象类的指针或引用
抽象类设计举例
- 平面上的几何图形可以抽象定义为类,如矩形类、圆类、三角形类等
- 将所有几何图形再加以抽象,定义为形状类
- 将形状类定义为抽象类shape
- 由于几何图形类中都包含求面积函数和求周长函数
- 在shape类中,将函数
area()
和circumenference()
声明为纯虚函数 - 再用shape类派生出矩形类和圆类,在派生类中具体定义相应的求面积与周长的函数
- 通过抽象类的对象指针访问派生类对象,实现动态绑定
基类定义为抽象类
#include<iostream>
#include<cmath>
using namespace std;
#define PI 3.1415926
class Shape
{
public:
virtual double area() = 0; // 纯虚函数
virtual double circumference() = 0; // 纯虚函数
};
两个派生类中定义重载虚函数
class Rectangle: public Shape
{
int x, y;
int width, hight;
public:
Rectangle(int x,int y,int w,int h)
{
this->x = x;
this->y = y;
width = w;
hight = h;
}
virtual double area() { return width * hight;}
virtual double circumference() { return 2.0 * (width + hight);}
};
class Circle:public Shape
{
int x, y;
int r;
public:
Circle(int x,int y,int r)
{
this->x = x;
this->y = y;
this->r = r;
}
virtual double area() { return PI*r*r;}
virtual double circumference() { return 2.0*PI*r; }
};
抽象类主函数测试
void main()
{
Rectangle r1(10,10,10,5);
Circle c1(1,2,1);
Shape *p1=&r1, &p2=c1; //指针或引用的方式
cout<<"长方形面积:"<<p1->area()<<endl;
cout<<"长方形周长:"<<p1->circumference()<<endl;
cout<<"圆面积:"<<p2.area()<<endl;
cout<<"圆周长:"<<p2.circumference()<<endl;
}