首先区别一些概念:

a.定义一个函数为虚函数,不代表函数为不被实现的函数

b.定义某个函数为虚函数,是为了允许用基类的指针来调用子类的这个函数

c.定义一个函数为纯虚函数,才代表这个函数为不被实现的函数

 

  接着来详细介绍虚函数和纯虚函数:

1.虚函数,“虚”就“虚”在所谓推迟联编或动态联编上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码时并不能确定被调用的是基类的函数还是哪个派生类的函数,所以定义为“虚”函数。

2.虚函数只能借助于指针或引用来达到多态的效果。

3.纯虚函数,是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要实现自己的方法,定义格式为:virtual void function() = 0;

4.含有纯虚函数的类称为抽象类,它不能生成对象。

5.定义纯虚函数的目的在于:使派生类仅仅是继承函数的接口;

纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者:“你必须提供一个纯虚函数的实现,但我不知道你会怎样实现他”。

6.关于抽象类:含有纯虚函数的类称为抽象类,不能实例化对象。

7.抽象类只能作为基类来使用,其纯虚函数的定义由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,那么这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,那么这个派生类就不再是抽象类了,它是一个可以实例化对象的具体的类。

8.虚函数必须实现,纯虚函数一定没有定义。

9.对于虚函数来说,父类和子类都有各自的版本,由多态方式编译的时候动态绑定。

10.实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

11.虚函数是C++中用于实现多态的机制,核心理念就是通过基类方位派生类定义的函数。

12.在有动态分配堆上内存的时候,析构函数必须是虚函数,但没必要是纯虚的。

13.友元不是成员函数,只有成员函数才可以是虚的,因此友元函数不可以是虚函数,但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

14.析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。