6、多态性-4、抽象类

抽象类是一种特殊的类,它为一个类族提供统一的操作界面。抽象类是为了抽象和设计的目的而建立的,可以说,建立抽象类,就是为了通过它多态地使用其中的成员函数。抽象类处于类层次的上层,一个抽象类自身无法实例化,也就是说我们无法定义一个抽象类的对象,只能通过继承机制,生成抽象类的非抽象派生类,然后再实例化

抽象类是带有纯虚函数的类。

1、纯虚函数

对于这种在基类中无法实现的函数,能否在基类中只说明函数原型用来规定整个类族的统一接口形式,而在派生类中在给出函数的具体实现呢?在c++中提供了纯虚函数来实现这一功能。

纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本,纯虚函数的声明格式为:

virtual 函数类型 函数名(参数表)=0;

实际上,它与一般的虚函数成员的原型在书写格式上的不同就在于后面添加了一个"=0",声明为纯虚函数之后,基类中就不再给出函数的实现部分。纯虚函数的函数体由派生类给出。

还有一种情况是函数体为空的虚函数,请注意它和纯虚函数的区别。纯虚函数根本就没有函数体,而空的虚函数的函数体为空,前者所在的类是抽象类,不能直接进行实例化,而后者所在的类是可以实例化的。他们共同的特点是都可以派生出新的类,然后在新类中给出虚函数新的实现,而且这种新的实现可以具有多态特征

2、抽象类

带有纯虚函数的类是抽象类。抽象类的主要作用是通过它为一个类族建立一个公共的接口,使他们能够更有效地发挥多态特性。抽象类声明了一族派生类的共同接口,而接口的完整实现,即纯虚函数的函数体,要由派生类自己定义。

如果派生类给出所有纯虚函数的函数实现,这个派生类就可以定义自己的对象,因而不再是抽象类,反之,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍然是一个抽象类。

抽象类不能实例化,即不能定义一个抽象类的对象,但是我们可以声明一个抽象类的指针和引用。通过指针和引用,我们就可以指向并访问派生类对象,进而访问派生类的成员,这种访问是具有多态特征的。

例子:

抽象类举例

在基类B0中将成员display()声明为纯虚函数,这样,基类B0就是一个抽象类,我们无法声明B0类的对象,但是可以声明B0类的指针和引用。B0类经过公有派生了B1类,B1类作为新的基类又派生了D1类。使用抽象基类B0类型的指针,当它指向某个派生类的对象时,就可以通过它访问该对象的虚成员函数。

#include<iostream>
using namespace std;
class B0
{
public:
virtual void display()=0;//纯虚函数成员
};
class B1:public B0
{
public:
void display(){cout<<"B1::display()"<<endl;}

};
class D1:public B1
{
public:
void display(){cout<<"D1::display()"<<endl;}
};
void fun(B0 *ptr)
{
ptr->display();
}

int main()
{
B0 *p;
B1 b1;
D1 d1;
p=&b1;
fun(p);
p=&d1;
fun(p);
getchar();
}

 

同时,程序中派生类的虚函数并没有用关键字virtual显式说明,因为他们与基类的纯虚函数具有相同的名称、参数以及返回值,由系统自动判断确定为虚函数。

 

posted on 2017-01-07 13:07  gary_123  阅读(143)  评论(0编辑  收藏  举报

导航