visual c++ 中抽象类与纯虚函数的用法
visual c++ 中抽象类与纯虚函数的用法
一般情况下,基类和派生类都可以用来创建对象,因为基类也定义了自己的属性和行为,但如果有需要,可以把基类定义为纯粹的一种抽象,即它的一些行为(成员函数)没有给出具体的定义。这种基类只能用于类的继承,并不能用来创建对象,这种类就称做抽象类。
这个定义比较抽象,来举一个现实生活中的例子:
“哺乳动物类”是一个基类,“猫类”、“狗类”都是“哺乳动物类”的派生类,读者可以说:“一只猫在叫”,因为这只在叫猫是真实存在的,它有着自己的实体。但读者如果说“一只哺乳动物在叫”就不太符合逻辑了,因为”哺乳动物”是一个抽象的概念,没有自己的实体。就像“哺乳动物”这样的类,就可以声明为抽象类,因为不会有“哺乳动物”这种会跑、会跳的动物出现,即它不会有实例。
请看下面的例子:
#include "iostream.h"
class mammal //哺乳动物
{
public:
virtual void Call()=0; //哺乳动物不允许“叫”
void Color(char * color); //颜色
void Class(char * cClass) ; //种类
char* GetColor();
char* GetClass();
private:
char* m_Color; //记录哺乳动物的颜色
char* m_Class; //记录哺乳动物的的种类
};
class Cat :public mammal //猫类
{
public:
void Call();
};
class Dog :public mammal //狗类
{
public:
void Call();
};
void mammal::Class(char * cClass) //各类的成员函数
{
m_Class=cClass;
}
void mammal::Color(char * color)
{
m_Color=color;
}
char* mammal::GetColor()
{
return m_Color;
}
char* mammal::GetClass()
{
return m_Class;
}
void Cat::Call()
{
cout<<"喵喵!一只"<
}
void Dog::Call()
{
cout<<"汪汪!一只"<
}
void main()
{
Cat taotao; //"淘淘"是只波斯猫
Dog benben; //"笨笨"是只黑色牧羊犬
taotao.Class("波斯猫");
taotao.Color("白色");
benben.Class("牧羊犬");
benben.Color("黑色");
mammal *mam[2]={&taotao,&benben};
for(int m=0;m<2;m++)
mam[m]->Call();
}
运行结果如图1所示。

图1 运行结果
这是一个很简单的使用抽象类的例子,在“哺乳动物”类中,并没有实际定义“叫”的动作,所以将成员函数写成“virtual void Call()=0;”,像这样没有具体实现的成员函数称为纯虚函数。纯虚函数是不能被调用的,仅仅提供了一个与派生类相一致的接口的作用。纯虚函数用virtual关键字声明,其一般格式如下:
virtual <数据类型><成员函数名>(<参数列表>)=0;
当基类是抽象类时,只有在派生类中重新给出基类中所有纯虚函数的定义,该派生类才不会成为抽象类。