dhdb  

纯虚函数与抽象类

一、纯虚函数

什么是纯虚函数?

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

virtual 函数类型 函数名(参数表)=0
##为什么要用纯虚函数? ###对于一些函数,需要在不同的派生类中用来执行相同类型操作来建立联系,那么就会想到虚函数,在基类中将其定义为虚函数,派生类中定义将基类的覆盖,通过基类的指针调用,就会起到此效果。但是,虚函数是需要在基类中定义,并要有具体的操作内容声明,而对于一些基类无法给出有意义的实现时,用虚函数就不知道该如何处理。纯虚函数就可以实现这一功能。代码一: 、、、 #include using namespace std; class Base1 { public:virtual void display() const = 0;//设置纯虚函数 };
class Base2 :public Base1
{
 public:void display()const;
};
void Base2::display()const
{
     cout << "Base2::display()" << endl;
}
class Derived :public Base2
{
 public:void display()const;
};
void Derived::display()const
{
     cout << "Derived::display()" << endl;
}
void fun(Base1 *ptr)
{
     ptr->display();
}
int main()
{
Base2 base2;
Derived derived;
fun(&base2);
fun(&derived);
return  0;
}

、、、

上述代码是在基类中设置了一个纯虚函数,在基类中并没有实际的具体内容,只声明了一个框架,在外部函数通过一个基类指针来调用不同派生类中的同名函数

如果将基类中的纯虚函数
virtual void display() const = 0;
改为
virtual void display() const

此时再运行上述代码时系统会报出错误

这就是纯虚函数在面对基类中函数无实际意义时相对于虚函数存在的优点

注意:1、纯虚函数函数与虚函数的区别在于纯虚函数有“=0”,而虚函数没有。

2、基类中也可以对纯虚函数给出实现,但是这在派生类中也必须给出相同的函数将其覆盖,否则在编译时系统会报出无法实例化的错误。如下图,将上面代码稍加修改如下图

代码二、

、、、
#include<iostream>
using namespace std;
class Base1
{
public:virtual void display() const=0 ;
};
void Base1::display()const//基类中给出纯虚函数的实现
{
     cout << "Base1::display()" << endl;
}
class Base2 :public Base1
{
 public:void show()const;//派生类中与基类中的函数不同不能将其覆盖
};
void Base2::show()const
{
     cout << "Base2::display()" << endl;
}
class Derived :public Base2
{
public:void show()const;
};
void Derived::show()const//派生类中与基类中的函数不同不能将其覆盖
{
     cout << "Derived::display()" << endl;
}
void fun(Base1 *ptr)
{
ptr->display();
}
int main()
{
Base2 base2;
Derived derived;
fun(&base2);
fun(&derived);
return  0;
}

、、、

在编译时系统报出如下错误

这说明在基类的派生类中没有对其虚函数进行实现,那么它仍是一个抽象类,抽象类是不能实例化,即不能定义成一个对象。所以才有了上述的错误。

二、抽象类

什么是抽象类?

抽象类是带有纯虚函数的类。即在基类中给出一个固定的框架描述,由派生类对其进行任意的不同方式的实现。这就为一个类族提供了一个公共接口,使它们能更有效的发挥多态性。

在上图代码一中基类中定义一个纯虚函数,在派生类中都对纯虚函数进行了不同的实现,因此派生类是非抽象类,可以定义一个对象,在fun()函数中定义一个抽象类的指针,通过其指针实现对相同函数不同功能的调用,实现多态性。

在代码二中基类定义的纯虚函数在派生类中没有给出实现,因此派生类也是抽象类,而抽象类是不能给出一个对象,所以在主函数中定义的一个两个派生类的对象是错误的。

posted on 2019-10-26 21:14  dhdb  阅读(366)  评论(0编辑  收藏  举报