发布日期:2015-12-29 10:07 来源: 标签: 编程语言 C++教程 C++派生类 C++析构函数
C++类继承体系中析构函数的操作次序与其构造函数正巧相反。此时派生类的析构函数调用要在基类析构函数调用之前发生。尤其当基类中包含有对象成员时,通常是先调用对象成员构造函数后调用基类构造函数,最后调用派生类构造函数,而析构函数调用顺序刚好相反。
      C++类继承体系中析构函数的操作次序与其构造函数正巧相反。此时派生类的析构函数调用要在基类析构函数调用之前发生。尤其当基类中包含有对象成员时,通常是先调用对象成员构造函数后调用基类构造函数,最后调用派生类构造函数,而析构函数调用顺序刚好相反。修改上一小节实例增加析构函数简单说明继承中析构函数使用情况,修改后的代码如下所示。
1.准备实例
      打开UE工具,创建新的空文件并且另存为chapter1007_01.h、chapter1007_01.cpp、chapter1007_02.h、chapter1007_02.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
//水果类头文件chapter1007_01.h
#include <iostream>
using namespace std;
class Fruit
{
         public:
                   Fruit(intid,string name);
                   ~Fruit();
         protected:
                   intm_id;
                   stringm_name;
};
//水果类源文件chapter1007_01.cpp
#include "chapter1007_01.h"
Fruit::Fruit(int id,string name)
{
         m_id= id;
         m_name= name;
         cout<<"Fruitclass construction!"<<endl;
}
Fruit::~Fruit()
{
         cout<<"Fruitclass destruction!"<<endl;
}
//苹果头文件chapter1007_02.h
#include "chapter1007_01.h"
class Apple: public Fruit
{
         public:
                   Apple(intid,string name,int price);
                   ~Apple();
                   voidshowAppleInfo();
         protected:
                   intm_price;
};
//苹果类源文件chapter1007_02.cpp
#include "chapter1007_02.h"
Apple::Apple(int id,string name,int price)
         :Fruit(id,name)
{
         m_price= price;
         cout<<"Appleclass construction!"<<endl;
}
Apple::~Apple()
{
         cout<<"Appleclass destruction!"<<endl;
}
void Apple::showAppleInfo()
{
         cout<<"Fruitid:"<<m_id<<endl;
         cout<<"Fruitname:"<<m_name<<endl;
         cout<<"Fruitprice:"<<m_price<<endl;
}
int main()
{
         Fruit fruit(1,"Fruit");
         Apple apple(2,"Apple",3);
         apple.showAppleInfo();
         return 0;
}
本实例主要通过水果类继承方式演示继承体系中析构函数执行顺序情况。程序主要由主函数与水果、苹果类组成。程序具体剖析见程序注释与后面的讲解。
2.编辑makefile
Linux平台下其makefile编译文件中涉及两个头文件以及两个源代码文件,makefile文件编辑如下。
OBJECTS=chapter1007_01.o chapter1007_02.o
CC=g++
Apple: $(OBJECTS)
       $(CC)$(OBJECTS) -o Apple
chapter1007_01.o: chapter1007_01.h
chapter1007_02.o: chapter1007_02.h 
clean:
         rm-f Apple core $(OBJECTS)
submit:
         cp-f -r Apple ../bin
         cp-f -r *.h ../include
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer @localhost src]$ make
g++    -c -ochapter1007_01.o chapter1007_01.cpp
g++    -c -ochapter1007_02.o chapter1007_02.cpp
g++ chapter1007_01.o chapter1007_02.o -o Apple
[developer @localhost src]$ make submit
cp -f -r Apple ../bin
cp -f -r *.h ../include
[developer @localhost src]$ cd ../bin
[developer @localhost bin]$ ./Apple
Fruit class construction!
Fruit class construction!
Apple class construction!
Fruit id:2
Fruit name:Apple
Fruit price:3
Apple class destruction!
Fruit class destruction!
Fruit class destruction!
      与上小节运行结果不同的是,本实例增加自定义析构函数中提示信息。因此在主程序中对象生命周期结束后,优先调用其派生类析构函数打印信息“Apple class Destruction!”。随后调用基类析构函数析构方法,最后因为基类对象实例最先被定义,所以基类析构函数最后被执行。
继承体系中构造析构函数的操作情况。建议初学者通过多写一些不同情况下处理构造析构的程序来验证总结继承体系中构造与析构执行顺序以及应用处理。

相关评论

专题信息
    C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性! 本教程从基础讲解了C++语言,希望对大家有所帮助,望多多支持中国站长网络学院。