首页 > 代码库 > c++ virtual 和 pure virtual的区别

c++ virtual 和 pure virtual的区别

参考资料:

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的特性

c++ virtual 和 pure virtual的区别