基类往往用于一些抽象的概念。就是说仅说明一个公共界面,而有派生类提供各自的实现版本。在这种情况下,基类的有些函数没有定义是很正常的,但要求派生类必须重新定义这些虚函数,以使派生类有意义。为此,C++i引用了纯虚函数的概念。
一个具备纯虚函数的基类称为抽象类。抽象类机制支持一般概念的表示,也用于定义接口。
纯虚函数
纯虚函数是基类说明的虚函数,他在该基类之中没有实现定义,要求所以派生类都必须定义自己的版本。纯虚函数的说明形式如下:virtual 类型 函数名(参数表)=0;赋值为0,是表示没有实现定义。虚函数的实现在他的派生类中定义。
以下举个简单的例子
//figure
#include
using namespace std;
class Figure
{
protected:
doubut x,y;
public:
void set_dim(double i,double j=0)
{
x=i;
y=j;
}
virtual void show_area()const=0;
};
class Tringle:public Figure
{
public:
void show_area()const
{
cout<<"Triangke with hight"<
Triangke with hight 10 and base 5 has an area of 25
Square with dimension 10*5 has an area of 50
Circle with redius 9 has an area of 254.34
我们可以看到在基类之中定义了纯虚函数(virtual void show_area()const=0;),纯虚函数没有在基类之中实现定义。还有,显而易见,通过基类Figure派生出的三个派生类之中对 void show_area()const=0进行了各自的定义。main函数通过不同对象的调用派生show_area()
函数的不同实现版本。
抽象类至chun纯虚函数,记住,是至少,就是绝对有纯虚函数。像上面例子中的Figure就有一个纯虚函数,它就是一个抽象类。定义了纯虚函数的派生类叫具体类,具体类,具体,具体说明纯虚函数的作用,对纯虚函数进行定义。
我们知道一个不论什么东西,它都会受到限制。没有什么东西是不受限制的。那么纯虚函数也受到c++的限制。
1 抽象类只能做其他类的基类 2 抽象类不能建立对象 3抽象类不能做参数类型,函数返回类型或显示类型转化。但是,可以说明抽象类的指针和引用。
感觉这么理解有点困难,别慌,来,咋举个例子看看。
对Figure抽象类的使用
Figure x ;//错误 抽象类不能建立对象
Figure *p;//可以说明抽象类的指针
Figure f()//错误 抽象类不能作为返回类型
void g(Figure);//错误 抽象类不能作为参数类型
Figure &h(Figure &);//正确,可以说明抽象类的引用
抽象类的指针和抽象类的引用是一个重点。我们先来讲抽象类的指针。
我们直接以上面的代码进行改动
#include"figure.h"
int main()
{
Figure *p;//纯虚函数的指针
Triangle t;
Square s;
Circle c;
p=&t;//调用地址
p->set_dim(10.0,5.0);//指向
p->show_area();
p=&s;
p->set_dim(10.0,5.0);
p->show_area();
p=&c;
p->set_dim(9.0);
p->show_area();
}
这么一看其实用纯虚函数的指针也挺简单的
接下来就是用抽象类引用的使用了
#include
using namespace std;
class Number
{
public:
Number(int i)
{
val=i;
}
virtual void show()const=0;//纯虚函数
protected:
int val;
};
class Hex:public Number
{
public:
Hex(int i):Number(i){ }
void show()const//别忘记后面的const
{cout<<"Hex="<
Dec=50
Hex=70
Oct=29
好了,最主要的提示我备注在了代码上,你要尝试自己去理解代码的运行。
假设一个派生类继承了一个纯虚函数的基类,但是它不对其进行重定义,那么这个派生类还是抽象类吗?
是的,它还是抽象类。切记
那么今天就结束了。
祝你好运,也祝我好运。好好生活。