关于构造函数和析构函数的调用顺序

/********* test1.cpp **********/
#include<iostream>
using namespace std;

class base1/*********************/
{
protected:
	char c;
public:
	base1(char ch);
	~base1();
};

base1::base1(char ch)
{
	c = ch;
	cout<<"c ="<<c<<endl;
	cout<<"base1构造函数被调用!"<<endl;
}

base1::~base1()
{
	cout<<"base1析构函数被调用!"<<endl;
}

class base2/*********************/
{
protected:
	int i;
public:
	base2(int j);
	~base2();
};

base2::base2(int j)
{
	i=j;
	cout<<"i ="<<i<<endl;
	cout<<"base2构造函数被调用!"<<endl;
}

base2::~base2()
{
	cout<<"base2析构函数被调用!"<<endl;
}

/*继承顺序影响构造、析构函数的调用顺序*/
class derive:public base1,public base2
//class derive:public base2,public base1
{
	int k;
public:
	derive(char ch,int i,int kk);
	~derive();
};

derive::derive(char ch,int ii,int kk):base1(ch),base2(ii),k(kk)
{
	cout<<"k="<<k<<endl;
	cout<<"derive构造函数被调用!"<<endl;
}

derive::~derive()
{
	cout<<"derive析构函数被调用!"<<endl<<endl;
}

int main()
{
	derive A('B',10,15);
	
	return 0;
}

 

/***********************************************************************/

 

/********* test2.cpp **********/

#include <iostream>
using namespace std;

class base1/*********************/
{
public:
	base1();
	~base1();
};

base1::base1()
{
	cout<<"base1()"<<endl;
}

base1::~base1()
{
	cout<<"~base1()"<<endl;
}

class base2/*********************/
{
public:
	base2();
	~base2();
};

base2::base2()
{
	cout<<"base2()"<<endl;
}

base2::~base2()
{
	cout<<"~base2()"<<endl;
}

class derive
{
private:
	base1 a;
	base2 b;
/********************
	base2 a;
	base1 b;
********************/
public:
	derive();
	~derive();
};

derive::derive()
{
	cout<<"derive()"<<endl;
}

derive::~derive()
{
	cout<<"~derive()"<<endl<<endl;
}

int main()
{
	derive *p = new derive;
	delete p;

	return 0;
}

 

 

构造函数:

派生类先调用基类的构造函数(继承顺序:从左往右,数据成员定义顺序:从上往下),再调用派生类自己的构造函数。

 

析构函数:

派生类先调用派生类自己的析构函数,再调用基类的析构函数(继承顺序: 从右往左,数据成员定义顺序: 从下往上)。

 

 

总之,(创建类对象时-调用构造函数的顺序 和 释放该对象时-调用析构函数的顺序)相反。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值