16.c/c++程序员面试宝典-虚函数与纯虚函数
虚函数的主要作用是建立抽象模型,从而可以达到方便扩展系统的目的。纯虚函数时指被标明为不具体实现的虚函数,是一种特殊的虚函数。
面试题81 虚函数与纯虚函数的区别***
分析:虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的形式为:
virtual 函数返回值类型 虚函数名(形参表)
{
函数体
}
虚函数扩展了派生类对象中隐藏基类函数的概念,当程序处于相似类家族的异构对象集合时,要使用到这些函数。
纯虚函数是一种特殊的虚函数,它的一般格式如下:
class<类名>
{
virtual<类型><函数名>(<参数表>)=0;
}
在很多情况下,基类中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
虚函数和纯虚函数的区别:纯虚函数是虚函数的一个子集,用于抽象类,含有纯虚函数的类就是抽象类,它不能生成对象。
【答案】纯虚函数是虚函数的一个子集。
面试题82 如何使用纯虚函数***
分析:为了方便使用多态特性,编程者常常需要在基类中定义虚拟函数。在很多情况下,基类本身生成对象是不合理的,例如,动物作为一个基类可以派生出猴子、犀牛等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数,则编译器要求在派生类中必须予以重载以实现多态性,同时含有纯虚函数的类称为抽象类,不不能生成对象。这样就很好地解决了上述两个问题。一个纯虚函数使用的示例代码如下:
class A //定义基类
{
public:
A();
void f1();
virtual void f2();
virtual void f3()=0;
virtual ~A();
};
class B : public A //定义子类
{
public:
B();
void f1();
void f2();
void f3();
virtual ~B();
};
int main()
{
A *m_j=new B();
m_j->f1();
m_j->f2();
m_j->f3();
delete m_j;
return 0;
}
上述代码中,f1()是一个普通的重载。调用m_j->f1();会去调用A类中的f1,它是在编程者写好代码的时候就定好的。也就是根据它是由A类定义的,这样就调用这个类的函数。f2()是虚函数。调用m_j->f2();会调用m_j到保存的对象中,对应的这个函数,这是由于new的B对象。f3()和f2()一样,只是在基类中不需要写函数实现。
【答案】纯虚函数用来定义没有意义的实现,用于抽象类中需要交给派生类具体实现的方法。