zoukankan      html  css  js  c++  java
  • C++中虚析构函数的作用

    在c++的类中虚析构函数一直不知道它有什么作用,等到今天来看才发现加virtual  和不加的区别特别大。

    #include<iostream>
    
    using namespace std;
    
    class Parent
    {
    protected:
    public:
    	Parent()
    	{;}
    	//virtual ~Parent()
    	~Parent()
    	{
    		cout<<"~Psrent
    ";
    	}
    virtual void print()
    	{
    		cout<<"p我仅仅是一个被调用的试验品、n
    ";
    	}
    };
    class Child:public Parent
    {
    protected:
    public:
    	Child()
    	{;}
    	~Child()
    	{
    		cout<<"child ~
    ";
    	}
     virtual void print()
    	{
    		cout<<"c我仅仅是一个被调用的试验品、n
    ";
    	}
    };
    void objplay()
    {
    	Child c1;
    	}
    void objplay2()
    {
    	Parent *p1=new Parent;
    	delete p1;
    }
    void objplay3()
    {
    	Parent *p2=new Child;
    	p2->print();//这里会造成多太。没成想开辟的child的内存空间,就是child的类型了,
    	                          //就要用child的print,如果不加vitrual,则直接用父类的
    	delete p2;//这里父类的析构函数不加virtual的话,就只会析构p2的类型,父类的析构函数,但是本身调用子类了,
    	           //所以这就造成了内存的泄漏,父类的析构函数必须为虚函数
    }
    int main()
    {
    	cout<<"objplay:
    ";
    	objplay();
    	cout<<"
    objplay2:
    ";
    	objplay2();
    	cout<<"
    objplay3:
    ";
    	objplay3();
    	system("pause");
    }
    

      结果显示为:

    在加上virtual后就变成了这样:

     由此观之virtual的作用很大,析构函数加上virtual后,会析构子类和父类,不会单一的只析构父类造成内存的泄漏。

  • 相关阅读:
    Django 的 CSRF 保护机制
    操作系统下spinlock锁解析、模拟及损耗分析
    .Net中的并行编程-1.路线图(转)
    [leetcode] 小心成环
    [leetcode] 题型整理之图论
    [leetcode] 提醒整理之进制
    [leetcode] 题型整理之二叉树
    [leetcode] 题型整理之查找
    [leetcode] 一些会的
    [leetcode] 题型整理之排序
  • 原文地址:https://www.cnblogs.com/xiaochige/p/6679962.html
Copyright © 2011-2022 走看看