zoukankan      html  css  js  c++  java
  • 【C++基础 08】virtual析构函数的作用

    在面向对象语言中,接口的多种不同的实现方式即为多态。c++可以使用virtual来实现多态。

    如果不使用virtual的话,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态编联(也就是迟后绑定,运行的时候才确定调用哪个对象)。

    关于virtual的用法比较简单,不再复述,我们这次来看看virtual析构函数的作用。

    1.示例

    我们先来看一段代码:

    class A
    {
    public:
      ~A()
      {
        cout<<"~A()";
      }
    };
    
    class A1 : public A{
    public:
      ~A1()
      {
        cout<<"~A1()";
      }
    };
    
    void main()
    {
      A* a = new A1();//基类指针接受子类对象
      delete a;
      return;
    }
    咋一看好像没什么问题,但运行一下你会发现输出的结果是~A()。

    也就是说只析构了基类的对象,没有释放子类的对象,造成局部销毁这种诡异的资源泄漏问题。

    消除这种问题的做法也很简单,给基类添加一个virtual析构函数,此后删除子类就会销毁整个对象。

    2.实现:

    class A
    {
    public:
    	virtual ~A()
    	{
    		cout<<"~A()";
    	}
    };
    
    class A1 : public A{
    public:
    	~A1()
    	{
    		cout<<"~A1()";
    	}
    };
    
    void main()
    {
    	A* a = new A1();
    	delete a;
    	return;
    }
    加上virutal关键字后,运行结果:先是子类的析构~A1() 然后是基类的析构~A()。整个对象被销毁,不存在局部销毁问题。


    一个比较好的判断方式是:如果你的基类(base classes)设计是为了多态用途,那么它应该声明一个virtual析构函数,如果classes带有任何virtual函数,那么它也应该有一个virtual析构函数。

  • 相关阅读:
    睁大你的眼睛,警惕职业生涯中的“红灯”
    几则好玩的脑筋急转弯
    File.Delete()的解决
    Powershell之True或False
    发送邮件
    IE与CSS兼容性
    WSS
    File.Delete()
    添加field部署
    css加载
  • 原文地址:https://www.cnblogs.com/fzll/p/3954581.html
Copyright © 2011-2022 走看看