• 为什么需要定义虚的析构函数?


    本来C++继承机制已经保证了构造和析构过程都会自动调用基类的对应部分的

    class Base
    {
    public:
    ~Base(){
    cout << "destructor Base" << endl;
    }
    };

    class Derived:public Base
    {

    };
    int main()
    {
    Derived *d = new Derived;
    delete d;
    return 0;
    }

    问题在于delete的时候d的静态类型和动态类型是一致的,但是有时候如果不一致,编译器无法在没有虚函数机制的帮助下调用正确的析构函数

    并不是所有的类都要定义虚的析构函数.因为在C++中引入虚函数是有代价的.

    只要当你需要通过delete ptr删除一个对象的时候,你才需要定义虚的析构函数.

    看下面的代码段:

    class Base{
    public:
         Base(int i):m(i){}   
         virtual void doSomeThing()=0;
    private:
        int m;   
    };
    
    class Derived:public Base{
    public:
         Derived(int v):Base(v){}
         void doSomeThing(){
        } 
    };
    
    int main(){
      
        Derived* d = new Derived(11);
        d->doSomeThing();
        delete d;
    }
    

     一切都工作得很好,直到有一天,你学习了设计模式,明白我们要面向接口编程,而不是面向实现编程.于是代码改成这样:

    int main(){
      
        Base* d = new Derived(11);
        d->doSomeThing();
        delete d;
    }
    

    于是问题来了,delete的时候是要调用析构函数的,可是我们的析构函数不是虚函数,于是只会调用Base的析构函数

    这样派生类就析构不完全,程序里隐含了bug.

  • 相关阅读:
    斐波那契(通项公式)
    数论--欧几里得定理(求最大公约数)
    5790 素数序数(筛素数版)
    数论--筛法求素数
    2491 玉蟾宫
    闭包详解
    ASP.NET 页生命周期概述1
    IIS 7.0 的 ASP.NET 应用程序生命周期概述
    IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述
    WeUI logo专为微信设计的 UI 库 WeUI
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4964870.html
Copyright © 2020-2023  润新知