纯虚函数与抽象类
假如我需要抽象一个事物——图形,那么我需要一个基类图形Tshape ,能够描绘所有的图形的公有特性和操作,比如颜色,输出操作等等。然后由这个基类派生出来很多派生类比如圆形,椭圆,矩形等等,然后圆形派生类中我可以增加新成员如半径,新增操作如生成钟表等等,椭圆又可以新增成员焦点,焦距等等。
但是,有一类操作是图形所共有的特性,但是具体到每一个图形的具体操作方法又不一样,比如求图形的面积操作,圆的面积要用到πr2,而矩形的面积只需a2即可。
这个时候我们不能再基类Tshape中就把这个getarea()函数定义出来,在Tshape中的这个函数只是为了向程序员表明getarea()函数需要在每个派生类中具体实现。定义在基类中的这个函数我们就可以把它写成纯虚函数。
#include <iostream>
using namespace std;
class Tshape
{
public:
virtual double getArea() = 0;
};
class Tcircle :public Tshape
{
private:
double r;
public:
double getArea(); //虚函数要求返回类型也相同
Tcircle(double r){ this->r = r; }
};
double Tcircle::getArea()
{
double area = 3.14*r*r;
return area;
}
class Trect :public Tshape
{
private:
double a;
public:
Trect(double a){ a = a; }
double getArea();
};
double Trect::getArea()
{
double area = a*a;
return area;
}
void main()
{
Tshape *p;
Tcircle circle(2.3);
Trect rect(2.6);
p = &circle;
cout << "circle's area is " << p->getArea() << endl;
p = ▭
cout << "rect's area is " << p->getArea() << endl;
}
纯虚函数的定义方法
纯虚函数的特点:
1.在某个抽象事物相应的较高级定义,比如交通工具派生出汽车和轮船,轮船汽车下又可以继续派生,然后需要一个获取价格定位的函数,那么可以在交通工具处定义纯虚函数,也可以在轮船和汽车处各自定义
2.没有函数体
3.不可以被调用
虚函数要求函数的返回值也相同
纯虚函数相当于对派生类做出了强制要求,你必须去实现这个函数功能,否则你就不能定义对象,这是和普通虚函数的区别
含有纯虚函数的类叫抽象类
1.不可以定义抽象类的对象,但是抽象类的指针和引用可以定义
2.抽象类的派生类如果没有实现该纯虚函数的功能的话,那么这个派生类仍然是抽象类
定义抽象类的对象
如果没有实现纯虚函数的派生类
#include <iostream>
using namespace std;
class Tshape
{
public:
virtual double getArea() = 0;
};
class Tcircle :public Tshape
{
private:
double r;
public:
double getArea(); //虚函数要求返回类型也相同
Tcircle(double r){ this->r = r; }
};
double Tcircle::getArea()
{
double area = 3.14*r*r;
return area;
}
class Trect :public Tshape
{
private:
double a;
public:
Trect(double a){ a = a; }
};
void main()
{
Trect rect;
}
纯虚函数使基类和派生类不能定义对象的功能只会出现在纯虚函数出现的位置到该纯虚函数被实现之间