zoukankan      html  css  js  c++  java
  • 将析构函数设置为虚函数,并且析构函数可以为纯虚函数

    为什么基类的析构函数是虚函数?

    在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。

    但如果不需要基类对派生类及对象进行操作,则不能定义虚函数,因为这样会增加内存开销.当类里面有定义虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间.所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数.

     

    为什么析构函数可以是纯虚函数?

    在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。

    class Test {

    public:

           virtual ~Test() = 0; // 声明一个纯虚析构函数

                 };

    这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:

              Test::~Test() {} // 纯虚析构函数的定义

    这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~awov的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上。

    虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。

    抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出。错了,除了析构函数外,其他函数都不行,必须要在派生类中进行实现。

    class a 

    public: 
    virtual ~a()=0; 
    }; 

    class b:public a 

    public: 
    virtual ~b(){}; 
    }; 

    int main() 

    b bb; 
    return 1; 
    析构函数是纯虚函数的亦为抽象类。 
    上面的例子所以错误,因为b继承a后没有改写a的纯虚函数,因此b也是抽象类,自然不能实例化。 
    修改如下则正确: 
    class a 

    public: 
    virtual ~a()=0; 
    }; 

    class b:public a 

    public: 
    virtual ~b(){}; 
    }; 

    a::~a(){};//改写a的纯虚函数,此时a仍为抽象类 

     

    int main() 

    b bb; 
    return 1; 

    注意此时a仍为抽象类不能实例化,a aa则错误。

     

  • 相关阅读:
    玩裸机s3c2440资料集合
    windows7与虚拟机fedora 9.0文件共享
    仪表运算放大器INA333
    sql语句中的 case.. when...then ...else 用法
    JS判断RadioButtonList是否有选中项
    SQL SERVER 2005 同步复制技术
    软件安全性标准
    div+css网页标准版式布局
    ComboBox和SelectedIndexChanged(转)
    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3069675.html
Copyright © 2011-2022 走看看