现在的位置: 首页 > 算法 > 正文

虚函数与纯虚函数有什么区别?

2020年01月13日 算法 ⁄ 共 1137字 ⁄ 字号 评论关闭

  虚函数的主要作用是建立抽象模型,从而可以达到方便扩展系统的目的。纯虚函数是指被标明为不具体实现的虚函数,是一种特殊的虚函数。

  纯虚函数和虚函数的区别

  虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的形式为:

  virtual 函数返回值类型 虚函数名 (形参表)

  {

  函数体

  }

  虚函数扩展了派生类对象中隐藏基类函数的概念,当程序处于相似家族的异构对象集合时,要使用到这些函数。

  纯虚函数是一种特殊的虚函数,它的一般格式如下:

  class <类名>

  {

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

  ...

  }

  在很多情况下,基类中不能对虚函数给出有意义的实现,而把它们说明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

  虚函数与纯虚函数的区别在于:纯虚函数是虚函数的一个子集,用于抽象类,含有纯虚函数的类就是抽象类,它不能生成对象。

  如何使用纯虚函数

  为了方便实用多态,编程者常常需要在基类中定义虚拟函数。在很多情况下,积累本身生成对象是不合情理的。例如,动物作为一个基类可以派生出猴子、犀牛等子类,但动物本身生成对象明显不合理。

  为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数,则编译器要求在派生类中必须予以重载以实现多态性。同时含有纯虚函数的类称为抽象类,不能生成对象。这样就很好的解决了上述两个问题。一个纯虚函数使用的示例代码如下:

  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(int argc, char* argv[]) //主函数

  {

  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()一样,只是在基类中不需要写函数实现。

  纯虚函数用来定义没有意义的实现,用于抽象类中需要交给派生类具体实现的方法。

  

抱歉!评论已关闭.