zoukankan      html  css  js  c++  java
  • 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的特性

  • 相关阅读:
    duplicate symbols for architeture arm64 linker command failed with code 1(use-c to see invocation)
    Operation not permitted
    [笔试]常考算法
    过滤ST/退市股票
    python动态调用函数
    dataFrame 切片操作
    DataFrame概念与创建
    DataFrame 加减乘除
    DataFrame查找
    DataFrame操作
  • 原文地址:https://www.cnblogs.com/qrlozte/p/4106222.html
Copyright © 2011-2022 走看看