面向对象----析构函数、虚函数

来源:互联网 发布:海康域名 编辑:程序博客网 时间:2024/06/12 21:13

系统只会自动释放栈内空间,而堆内空间需要用户自己维护------即c语言中程序退出会释放栈中空间,而堆中自己申请的空间需要自己管理释放。


C++中,除了new来的空间存放在堆内,其他均存放在栈中。


 显式调用析构函数的时候,析构函数相当于的一个普通的成员函数,只会执行析构代码中的内容,不会释放栈中的空间,也不会释放对象。


析构函数在下边3种情况时被调用:
1.对象生命周期结束,被销毁时;
2.delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;
3.对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。


由于多态性,导致基类的指针指向派生类的时候,在析构的时候,只会析构基类的空间,不会执行派生类的析构,从而导致内存泄露。


构造函数的调用顺序总是如下:
1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序。
2.成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。
3.派生类构造函数。

析构函数
 

   析构函数的调用顺序与构造函数的调用顺序正好相反,将上面3个点反过来用就可以了,首先调用派生类的析构函数;其次再调用成员类对象的析构函数;最后调用基类的析构函数

即构造函数的顺序和析构函数的顺序完全相反

下面用例子来说说构造函数的的调用顺序:

#include "stdafx.h"#include "iostream"using namespace std;class Base{public:    Base(){ std::cout<<"Base::Base()"<<std::endl; }    ~Base(){ std::cout<<"Base::~Base()"<<std::endl; }};class Base1:public Base{public:    Base1(){ std::cout<<"Base1::Base1()"<<std::endl; }    ~Base1(){ std::cout<<"Base1::~Base1()"<<std::endl; }};class Derive{public:    Derive(){ std::cout<<"Derive::Derive()"<<std::endl; }    ~Derive(){ std::cout<<"Derive::~Derive()"<<std::endl; }};class Derive1:public Base1{private:    Derive m_derive;public:    Derive1(){ std::cout<<"Derive1::Derive1()"<<std::endl; }    ~Derive1(){ std::cout<<"Derive1::~Derive1()"<<std::endl; }};int _tmain(int argc, _TCHAR* argv[]){    Derive1 derive;    return 0;}运行结果是:Base::Base()Base1::Base1()Derive::Derive()Derive1::Derive1()Derive1::~Derive1()Derive::~Derive()Base1::~Base1()Base::~Base()



------------------------------虚函数----------------------------------------

<span style="font-size:14px;">这里是一个例子:class awov { // awov = "abstract w/o// virtuals"public:virtual ~awov() = 0; // 声明一个纯虚析构函数};</span>

基类是虚函数,派生类自动继承该特性,称为虚函数


0 0