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

    建议

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

  • 相关阅读:
    结合php ob函数理解缓冲机制
    php中的require-once
    PHP面试题基础问题
    Jquery显示与隐藏input默认值的实现代码
    win7下cmd常用命令
    采用cocos2d-x lua 的listview 实现pageview的翻页效果之上下翻页效果
    采用cocos2d-x lua 制作数字滚动效果样例
    luac++
    lua相关笔记
    cornerstone知识点
  • 原文地址:https://www.cnblogs.com/xiao-qingjiang/p/13080676.html
Copyright © 2011-2022 走看看