公有继承基类和派生类之间构造和析构、赋值和拷贝构造函数的关系(下)

本文探讨了公有继承情况下基类与派生类之间的拷贝构造函数关系,包括系统默认拷贝构造函数的行为、父类拷贝构造函数的作用以及子类中显式定义拷贝构造函数的必要性。

公有继承基类和派生类之间构造和析构、赋值和拷贝构造函数的关系(下)

4、公有继承基类和派生类之间拷贝构造函数的关系
如果子类Text公有继承父类Object,在用已有的Text对象t1初始化Text对象t2时,如果没有写拷贝构造函数,系统的拷贝构造函数会把t1对象按位拷贝给t2对象,产生数据完全相同的t1和t2;
代码测试:

#include<iostream>
using namespace std;
class Object
{
	private:
		int val;
	public:
	Object(int a=0) :val(a)
	{
		cout<<"construct Object"<<endl;
	}
	~Object()
	{
		cout<<"destory Object"<<endl;
	}
	void showObject()
	{
		cout<<val<<endl;
	}
} ;
class Text :public Object
{
	private:
		int num;
	public:
		Text(int b=0) :num(b),Object(b+10)
		{
			cout<<"construct Text"<<endl;
		}
		~Text()
		{
			cout<<"destory Text"<<endl;
		}
		void showText()
		{
			cout<<num<<endl;
		}
};
int main()
{
	Text t1(10);
	Text t2(t1);
	t1.showObject();
	t1.showText();
	t2.showObject();
	t2.showText();
	return 0;
}

在这里插入图片描述
如果父类写了拷贝构造函数,用t1初始化t2时,也能完成父类对象部分的拷贝
代码测试:

#include<iostream>
using namespace std;
class Object
{
	private:
		int val;
	public:
	Object(int a=0) :val(a)
	{
		cout<<"construct Object"<<endl;
	}
	~Object()
	{
		cout<<"destory Object"<<endl;
	}
	Object(const Object& obj):val(obj.val)
	{
		cout<<"copy construct Object"<<endl;
	}
	void showObject()
	{
		cout<<val<<endl;
	}
} ;
class Text :public Object
{
	private:
		int num;
	public:
		Text(int b=0) :num(b),Object(b+10)
		{
			cout<<"construct Text"<<endl;
		}
		~Text()
		{
			cout<<"destory Text"<<endl;
		}
		void showText()
		{
			cout<<num<<endl;
		}
};
int main()
{
	Text t1(10);
	Text t2(t1);
	t1.showObject();
	t1.showText();
	t2.showObject();
	t2.showText();
	return 0;
}

如果子类Text中写了拷贝构造函数,则需要在子类拷贝构造函数中调用父类的拷贝构造函数,这样才能完成t1对t2的初始化,如果子类拷贝构造函数中没有调用父类的拷贝构造函数,则t2的父类对象部分不会用t1的父类对象部分来初始化。
代码测试:

#include<iostream>
using namespace std;
class Object
{
	private:
		int val;
	public:
	Object(int a=0) :val(a)
	{
		cout<<"construct Object"<<endl;
	}
	~Object()
	{
		cout<<"destory Object"<<endl;
	}
	Object(const Object& obj):val(obj.val)
	{
		cout<<"copy construct Object"<<endl;
	}
	void showObject()
	{
		cout<<val<<endl;
	}
} ;
class Text :public Object
{
	private:
		int num;
	public:
		Text(int b=0) :num(b),Object(b+10)
		{
			cout<<"construct Text"<<endl;
		}
		~Text()
		{
			cout<<"destory Text"<<endl;
		}
		Text(const Text& T) :num(T.num),Object(T)
		{
			cout<<"copy construct Text"<<endl;
		}
		void showText()
		{
			cout<<num<<endl;
		}
};
int main()
{
	Text t1(10);
	Text t2(t1);
	t1.showObject();
	t1.showText();
	t2.showObject();
	t2.showText();
	return 0;
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_200_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值