C++ 虚函数与纯虚函数


今天讲讲C++中,虚函数与纯虚函数的用法和区别。

虚函数的提出在我上一篇关于C++的文章中已经提过(见),是为了解决多继承的二义性而提出的,今天不再赘述;

而纯虚函数是一种特殊的函数,它的作用是在基类中不给出有意义的实现,而把说明成纯虚函数,它的实现留给该基类的派生类去做。包含纯虚函数的类就是抽象类,抽象类不能被实例化,但是可以定义指向抽象类数据的指针变量,当派生类称为具体类后,就可以用这种指针指向派生类的对象,然后通过该指针调用虚函数,实现多态操作。

虚函数和纯虚函数的书写格式类似于下面:

  class Student

  {

      virtual char * test();    //虚函数

      virtual char * Category() =0;  //纯虚函数

  };

虚函数可以被直接调用,也可以备子类重载以后以多态的形式调用,而纯虚函数必须在子类中实现该函数才可以使用,因为纯虚函数在基类只有声明而没有定义。

虚函数和纯虚函数的定义中不能有static 标识符,原因很简单,被static修饰的函数在编译时候要求前期绑定,然而虚函数确实动态绑定,而且被两者修饰的函数生命周期也不一样。

如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类不能被直接调用,必须呗子类集成重载以后,根据要求调用其子类的方法。

class StudentA
  {
public:
    virtual void funOne() = 0;  // 说明fun函数为纯虚函数
    virtual void funTwo();
};

class StudentB
{
public:
  virtual void funOne();
  virtual void funTwo();
};

// CA,CB类的实现
...

void main()
{
    StudentA xiaoliu;  // 不允许,因为类CA中有纯虚函数
    StudentB xiaoxin;  // 可以,因为类CB中没有纯虚函数
    ...
}

本文简要介绍了虚函数和纯虚函数,并对它们做了简要区分。简单来说,虚函数是为了多重继承的二义性问题而提出的解决方案,纯虚函数的提出是使一些类的实例化更加符合逻辑,便于实现多态。

相关内容