包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数。抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针。像在开发程序的过程中,并不是所有代码都是由软件构造师自己写的,有时候需要调用库函数,有时候分给别人来写。一名软件构造师可以通过纯虚函数建立接口,然后让程序员填写代码实现接口,而自己主要负责建立抽象类。
纯虚函数
纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能。
许多情况下,在基类中不能给虚函数一个有意义的定义,这时可以在基类中将它说明为纯虚函数,而其实现留给派生类去做。纯虚函数不能被直接调用,仅起到提供一个与派生类相一致的接口的作用。
声明纯虚函数的形式如下:virtual 类型 函数名(参数列表)=0;
纯虚函数不可以被继承。当基类是抽象类时,在派生类中必须给出基类中纯虚函数的定义,或者在该类中再声明其为纯虚函数。只有在派生类中给出了基类中所有纯虚函数的实现时,该派生类才不再成为抽象类。
例子:
创建纯虚函数
#include<iostream>
using namespace std;
class Figure
{
public:
virtual double getArea() = 0;
};
const double PI = 3.14;
class Circle:public Figure
{
private:
double Radius;
public:
Circle(double R)
{
Radius = R;
}
double getArea()
{
return Radius * Radius * PI;
}
};
class Rectangle:public Figure
{
protected:
double Height,Width;
public:
Rectangle(double height,double width)
{
Height = height;
Width = width;
}
double getArea()
{
return Height * Width;
}
};
int main()
{
Figure *fg1;
fg1 = new Rectangle(4.0,5.0);
cout << fg1->getArea() << endl;
delete fg1;
Figure *fg2;
fg2 = new Circle(4.0);
cout << fg2->getArea() << endl;
delete fg2;
return 0;
}
注意:
对于包含纯虚函数的类来说,是不能够实例化的,“Figure figure;”是错误的。
结果:
程序定义了矩形类Rectangle和圆形类Circle,两个类都派生于图形类Figure。图形类是一个在现实生活中不存在的对象,抽象类面积的计算方法不确定,所以,将图形类Figure的面积计算方法设置为纯虚函数,这样圆形有圆形面积的计算方法,矩形有矩形面积的计算方法,每个继承自Figure的对象都有自己的面积,通过getArea成员函数就可以获取面积值。
实现抽象类中的成员函数
抽象类通常用于作为其他类的父类,从抽象类派生的子类如果不是抽象类,则子类必须实现父类中的所有纯虚函数。
例子:
#include<iostream>
using namespace std;
class CEmployee
{
public:
int m_ID;
char m_Name[128];
char m_Depart[128];
virtual void OutputName() = 0; //定义抽象成员函数
};
class COperator:public CEmployee
{
public:
char m_Password[128];
void OutputName() //实现父类中的纯虚成员函数
{
cout << "Operator's name:" << m_Name << endl;
}
COperator()
{
strcpy(m_Name,"Johnson");
}
};
class CSystemManager:public CEmployee
{
public:
char m_Password[128];
void OutputName() //实现父类中的纯虚成员函数
{
cout << "SystemManager's name:" << m_Name << endl;
}
CSystemManager()
{
strcpy(m_Name,"Johnson666");
}
};
int main()
{
CEmployee *pWorker;
pWorker = new COperator();
pWorker->OutputName();
delete pWorker;
pWorker = NULL;
pWorker = new CSystemManager();
pWorker->OutputName();
delete pWorker;
pWorker = NULL;
return 0;
}
结果:
程序中从CEmployee类派生了两个子类,分别为COperator和CSystemManager。这两个类分别实现了父类的纯虚成员函数OutputName。同样的一条语句“pWorker->OutputName();”,由于pWorker指向的对象不同,其行为也不同。
来源:freebuf.com 2021-06-14 21:59:44 by: Johnson666
请登录后发表评论
注册