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

posted @ 2014-11-18 17:00  rldts  阅读(6659)  评论(0编辑  收藏  举报