纯虚函数就是为了阻止这个类的实例化。使其成为抽象类。
当然虚函数不提供实现看起来也能阻止类的实例化,但它和纯虚函数比起来还有以下不足:
1、一方面,从语法上说是不清晰的,你的类的使用者在在看到你的类的定义的时候无法确定哪些函数是没有提供实现的虚函数,而如果你写成纯虚函数就非常明确,一眼就可以看出来。
2、另一方面,虚函数不提供实现,如果使用者试图实例化这个类,在编译阶段无法发现错误,必须等到链接阶段才能发现,而且链接错误也仅仅是“无法解析的外部符号”,这种错误提示很不明确,当错误较多时很难找到真正的原因。 而如果是纯虚函数则编译器在编译阶段就直接会报错,并且会在错误中明确告知使用者不应实例化抽象类,非常便于定位错误。
如果一个类中含有纯虚函数, 则这个类则被视为抽象基类, 无法实例化, 即不能生成以这个基类为类型的实例.
(注意, 为了实现多态, 这个基类的指针是可以被创建并指向继承这个基类的实例)
虚函数可以被实现, 也可以被覆盖(也可以不被覆盖, 视乎继承类是否有重新实现这个函数). 调用时究竟使用哪个过程取决于调用的对象是基类对象还是继承类对象.
纯虚函数不能被实现, 因此强制要求所有的继承类去覆盖这个纯虚函数, 否则不让编译通过.
==== 分割线 ====
2015.3.18
纯虚函数也可以有实现。