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

    建议

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

  • 相关阅读:
    Python 爬虫
    Web 前端编程运维必备
    Docker 运维高级应用管理
    Python 运维之路
    Linux 运维之路
    8086汇编 中断
    8086汇编 rep 指令
    8086汇编 cmp 指令
    8089汇编 标志寄存器
    8086汇编 call 指令
  • 原文地址:https://www.cnblogs.com/xiao-qingjiang/p/13080676.html
Copyright © 2011-2022 走看看