参考资料:
http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained
验证代码:
#include <iostream> using namespace std; class Base { public: virtual void VirtualFunc() { cout << "Base virtual" << endl; } void NonVirtualFunc() { cout << "Base non-virtual" << endl; } }; class Derived : public Base { public: void VirtualFunc() { cout << "Derived virtual" << endl; } void NonVirtualFunc() { cout << "Derived non-virtual" << endl; } }; int main() { Base base; Derived derived; Base *dPtr = &derived, *bPtr = &base; // Base &dRef = derived, &bRef = base; // 使用引用代替指针也是一样的效果 dPtr->VirtualFunc(); dPtr->NonVirtualFunc(); bPtr->VirtualFunc(); bPtr->NonVirtualFunc(); return 0; }
1、加了virtual关键字,就可以使用polymorphism(多态)的特性(上述代码已验证)
2、加了virtual关键字,可以在Base就提供implementation,允许生成Base的objects(上述代码已验证)
3、加了virtual关键字,并加上 "=0",就成为pure virtual,Base不允许提供implementation,因此也就不允许生成Base的objects(尝试把Base.VirtualFunc改为pure的再编译,会报错,即使你提供了implementation也要报错)
4、Derived继承了Base,除非提供了implementation,否则继续保持从Base继承得来的virtual或者pure virtual特性
总结:
1、virtual本身是用来说明:这个function可以实现polymorphism的特性,仅virtual关键字本身并不会导致一个class是abstract的(也就是说就如Base一样,你可以在Base中定义一个virtual function,但是只要你提供了该function的实现,则Base仍然是可实例化的)。如果一个class有sub-class,那么显然这个class的destructor必须是virtual的(否则在delete Base-class的pointer的时候可能无法正确的执行到Sub-class的destructor),现在的编译器一般都会检测到这个问题并给出warning
2、pure virtual是virtual的特例(也就是说,既提供了polymorphism的特性,还提供了更强的约束性),这个“更强的约束性”体现在哪儿呢?:定义pure virtual function的class不可实例化(例如你把Base.VirtualFunc改为pure的,那么Base就不能生成objects了,哪怕你为VirtualFunc提供了实现也不行,因为编译器禁止为pure virtual function提供实现);而通过继承而得到pure virtual function的class在override(重写,也就是提供该pure virtual function的implementation)该pure virtual function之后可以生成objects,否则继续保持abstract的特性。pure virtual是用来实现类似于java中的abstract class和interface特性,也就是说pure virtual的存在会导致一个class具有abstract的特性