简单介绍C++编程中派生类的析构函数
和构造函数类似,析构函数也是不能被继承的。
创建派生类对象时,构造函数的调用顺序和继承顺序相同,先执行基类构造函数,然后再执行派生类的构造函数。但是对于析构函数,调用顺序恰好相反,即先执行派生类的析构函数,然后再执行基类的析构函数。
请看下面的例子:
#include <iostream> using namespace std; class A{ public: A(){cout<<"A constructor"<<endl;} ~A(){cout<<"A destructor"<<endl;} }; class B: public A{ public: B(){cout<<"B constructor"<<endl;} ~B(){cout<<"B destructor"<<endl;} }; class C: public B{ public: C(){cout<<"C constructor"<<endl;} ~C(){cout<<"C destructor"<<endl;} }; int main(){ C test; return 0; }
运行结果:
A constructor B constructor C constructor C destructor B destructor A destructor
从运行结果可以很明显地看出来,构造函数和析构函数的执行顺序是相反的。
需要注意的是,一个类只能有一个析构函数,调用时不会出现二义性,所以析构函数不需要显式地调用。
相关推荐
-
C++函数返回值为对象时,构造析构函数的执行细节
看如下代码: 复制代码 代码如下: #include<iostream>class TestConstructor{public: TestConstructor() { std::cout<<"TestConstructor()"<<std::endl; } ~TestConstructor() { std::cout<<"~TestConstructor()"
-
C++虚析构函数的使用分析
在C++中,不能声明虚构造函数,但可以声明虚析构函数.多态性是指不同的对象对同一消息有不同的行为特性.虚函数作为运行时多态性的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的.析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,析构函数最好都是virtual的.首先解释一下虚构函数和指针之间是如何交互的,以及虚析构函数的具体含义.例如以下代码,其中SomeClass是含有非virtual析构函数的一个类:SomeClass *p= new SomeCla
-
c++基础语法:构造函数与析构函数
说实话c++还是以前在学校的时候用过的,从毕业到现在一直用c嵌入式编程,现在重新搬出C++语法 ,如果理解上有错误的地方,还请路过的朋友多指正--- 构造函数用来构造一个对象,主要完成一些初始化工作,如果类中不提供构造函数,编译器会默认的提供一个默认构造函数(参数为空的构造函数就是默认构造函数) :析构函数是隐式调用的,delete对象时候会自动调用完成对象的清理工作. 现在主要看看继承中的构造函数和析构函数的调用: 复制代码 代码如下: class A {} :class B : publ
-
浅谈C++基类的析构函数为虚函数
1.原因: 在实现多态时, 当用基类指针操作派生类, 在析构时候防止只析构基类而不析构派生类. 2.例子: (1). #include<iostream> using namespace std; class Base{ public: Base() {}; ~Base() {cout << "Output from the destructor of class Base!" << endl;}; void DoSomething() { cout
-
深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
1 . 用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将调用类的默认拷贝函数来构造目标对象.2 . 当一个函数的返回值为一个类的对象时,如果在调用函数中,没有定义一个对象来接收这个返回对象值,会用返回一个临时对象保存返回对象的值.在被调用函数结束时,这个临时对象被销毁.而当调用函数中有一个接受对象时,就将返回对象赋值给接收对象,这个返回对象在调用函数结束时调用析构函数.3. 当类有一个带有一个参数的构造函数时,可以用这个参数同类型的数据初始化这
-
C++类成员构造函数和析构函数顺序示例详细讲解
对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象.C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数. (2)类的非静态数据成员,按照声明的顺序创建. (3)执行该类的构造函数. 即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数. 下面看一个例子吧 复制代码 代码如下: class c{public: c(){ printf("c\n"); }protected:private:}; class b {pub
-
深入解析C++中的构造函数和析构函数
构造函数:在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数:在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载,只能有一个. 调用构造函数和析构函数的顺序:先构造的后析构,后构造的先折构.它相当于一个栈,先进后出. 复制代码 代码如下: #include<iostream>#include<string>using namespace std;class Student{ public: Stud
-
解析C++中虚析构函数的作用
我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类: 复制代码 代码如下: class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };}
-
详解C++编程中的析构函数
C++析构函数 创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作(例如回收创建对象时消耗的各种资源),这个函数被称为析构函数. 析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要用户调用,而是在销毁对象时自动执行.与构造函数不同的是,析构函数的名字是在类名前面加一个"~"符号. 注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数.如果用户没有定义,那么编译器会自动生成. 析构函数举例: #inc
-
从汇编看c++的默认析构函数的使用详解
c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数.由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数.两者的分析情况一样(对于默认的构造函数分析,请参看<从汇编看c++中默认构造函数的使用分析>).并且编译器会提供非无用的默认析构函数情形和默认构造函数类似: 1 类含有虚成员函数(类继承自虚基类或者继承的基类含有虚成员函数,也属于这种情况) 2 类继承自一个基类,基类含有自定义析构函数(如果基类没有
-
简要解读C++的动态和静态关联以及虚析构函数
C++静态关联与动态关联.C++是怎样实现多态性的 在现实生活中,多态性的例子是很多的.我们分析一下人是怎样处理多 态性的.例如,新生被录取人大学,在人学报到时,先有一名工作人员审查材料,他的职责是甄别资格,然后根据录取通知书上注明的录取的系和专业,将材料转到有关的系和专业,办理具体的注册人学手续,也可以看作调用不同部门的处理程序办理入学手续.在学 生眼里,这名工作人员是总的人口,所有新生办入学手续都要经过他.学生拿的是统一的录取通知书,但实际上分属不同的系,要进行不同的注册手续,这就是多态.那
-
全面解析C++中的析构函数
"析构函数"是构造函数的反向函数.在销毁(释放)对象时将调用它们.通过在类名前面放置一个波形符 (~) 将函数指定为类的析构函数.例如,声明 String 类的析构函数:~String(). 在 /clr 编译中,析构函数在释放托管和非托管资源方面发挥了特殊作用. 析构函数通常用于在不再需要某个对象时"清理"此对象.请考虑 String 类的以下声明: // spec1_destructors.cpp #include <string.h> class
随机推荐
- PHP中的函数声明与使用详解
- 键盘各键对应的键值
- Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
- 微信小程序 利用css实现遮罩效果实例详解
- 请注意那些容易被忽略的SQL注入技巧
- IIS “另一个程序正在使用此文件,进程无法访问。”错误提示的解决办法
- Android:控件GridView的使用实例
- Oracle 11g Release (11.1) 索引底层的数据结构
- Python中easy_install 和 pip 的安装及使用
- Android自定义TabLayout效果
- java图片添加水印实例代码分享
- SQL SERVER 删除重复内容行
- jquery实现上下左右滑动的方法
- 浅谈spring中的default-lazy-init参数和lazy-init
- JS简单实现登陆验证附效果图
- React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
- Android 再按一次返回键退出程序实现思路
- WordPress自定义时间显示格式
- 毕业论文-客户关系管理与数据挖掘技术综述
- log4j2 项目日志组件的实例代码