C++——抽象类之纯虚函数和实现抽象类中的成员函数 – 作者:Johnson666

包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数。抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针。像在开发程序的过程中,并不是所有代码都是由软件构造师自己写的,有时候需要调用库函数,有时候分给别人来写。一名软件构造师可以通过纯虚函数建立接口,然后让程序员填写代码实现接口,而自己主要负责建立抽象类。

纯虚函数

纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能。
许多情况下,在基类中不能给虚函数一个有意义的定义,这时可以在基类中将它说明为纯虚函数,而其实现留给派生类去做。纯虚函数不能被直接调用,仅起到提供一个与派生类相一致的接口的作用。
声明纯虚函数的形式如下:
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;”是错误的。
结果:
image.png
程序定义了矩形类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;
}

结果:
image.png
程序中从CEmployee类派生了两个子类,分别为COperator和CSystemManager。这两个类分别实现了父类的纯虚成员函数OutputName。同样的一条语句“pWorker->OutputName();”,由于pWorker指向的对象不同,其行为也不同。

来源:freebuf.com 2021-06-14 21:59:44 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论