• 析构函数与虚析构函数


    建议

    在程序中最好把基类的析构函数声明为虚函数,即使基类不需要析构函数,也显示定义一个结构体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。

    例题 7-1 马会飞 (15分)
    已知Horse类是Pegasus类的父类,根据以下主函数完善程序内容,以实现规定的输出。不允许改变主函数的内容。

    int main()
    {
    	Horse *p1 = new Horse; //输出:Horse 申请了空间...
    	Horse *p2 = new Pegasus; /*  输出两行:
    	                             Horse 申请了空间...
    	                             Pegasus 申请了空间...   
    			         */	
    	cout << endl; 
    	
    	p1->Fly(); //输出:Just a horse.
    	p2->Fly(); //输出:I can fly!
    	cout << endl; 
    	
    	delete p1; //输出:Horse 释放了空间...
    	delete p2;  /* 输出两行:
    	               Pegasus 释放了空间... 
    	               Horse 释放了空间... 
    		    */
    	return 0;
    }
    

    无输入样例
    输出样例

    Horse 申请了空间...
    Horse 申请了空间...
    Pegasus 申请了空间...
    
    Just a horse.
    I can fly!
    
    Horse 释放了空间...
    Pegasus 释放了空间...
    Horse 释放了空间...
    

    AC代码

    #include<iostream>
    using namespace std;
    class Horse {
    public:
    	virtual void Fly() {
    		cout << "Just a horse." << endl;
    	}
    	Horse() { cout << "Horse 申请了空间..." << endl; }
    	virtual ~Horse() {
    		cout << "Horse 释放了空间..." << endl;
    	}
    };
    
    class Pegasus :public Horse {
    public:
    	virtual void Fly() {
    		cout << "I can fly!" << endl;
    	}
    	~Pegasus() { cout << "Pegasus 释放了空间..." << endl; }
    	Pegasus() :Horse(){
    		cout << "Pegasus 申请了空间..." << endl;
    	}
    };
    int main()
    {
    	Horse *p1 = new Horse; //输出:Horse 申请了空间...
    	Horse *p2 = new Pegasus; /*  输出两行:
    	                             Horse 申请了空间...
    	                             Pegasus 申请了空间...   
    			         */	
    	cout << endl; 
    	
    	p1->Fly(); //输出:Just a horse.
    	p2->Fly(); //输出:I can fly!
    	cout << endl; 
    	
    	delete p1; //输出:Horse 释放了空间...
    	delete p2;  /* 输出两行:
    	               Pegasus 释放了空间... 
    	               Horse 释放了空间... 
    		    */
    	return 0;
    }
    

    先说结论

    只有当基类的析构函数被声明为虚函数时,派生类调用析构函数时才会一起按照派生->对象成员->基类的顺序调用析构函数,否则智慧调用派生类自己的析构函数
    例如

    virtual ~Horse() {//声明了虚函数
    		cout << "Horse 释放了空间..." << endl;
    	}
    

    没有声明虚函数

    ~Horse() {
    		cout << "Horse 释放了空间..." << endl;
    	}
    

    建议

    在程序中最好把基类的析构函数声明为虚函数,即使基类不需要析构函数,也显示定义一个结构体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。

  • 相关阅读:
    dubbo源码阅读-服务订阅(八)之本地订阅(injvm)
    dubbo源码阅读-服务订阅(八)之主流程
    dubbo源码阅读-服务暴露(七)之远程暴露(dubbo)
    dubbo源码阅读-配置(二)之API配置
    dubbo源码阅读-容器启动(六)
    LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]
    LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
    LIRe 源代码分析 4:建立索引(DocumentBuilder)[以颜色布局为例]
    智能电视大战背后的秘密
    二线视频网站突围战
  • 原文地址:https://www.cnblogs.com/xiao-qingjiang/p/13080676.html
Copyright © 2020-2023  润新知