zoukankan      html  css  js  c++  java
  • 析构函数与虚析构函数

    建议

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

    例题 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;
    	}
    

    建议

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

  • 相关阅读:
    Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方案
    Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
    接口的作用
    Android中Service(服务)详解
    跟 Task 有关的 Intent对象中设置的Flag
    android onNewIntent
    [Android]如何导入已有的外部数据库
    android的文件操作
    MVC 数据验证
    Html辅助方法 之 Form表单标签
  • 原文地址:https://www.cnblogs.com/xiao-qingjiang/p/13080676.html
Copyright © 2011-2022 走看看