C++ Primer Plus书之--C++ 继承和动态内存分配(使用new和delete), 继承关系中的析构函数, 复制构造函数, 赋值运算符及友元函数

本文详细介绍了C++中继承类如何处理动态内存分配,包括不使用new的情况和使用new的情况。在不使用new时,派生类无需特殊处理析构、复制构造和赋值运算符,因为基类已处理。而当派生类使用new时,必须自定义析构函数、复制构造函数和赋值运算符,以确保正确释放内存。文章还讨论了友元函数在继承和动态内存分配中的作用。

第一种情况: 派生类不使用new

假设基类使用了动态内存分配, 并且重新定义复制和赋值运算符:

class BaseDMA
{
private:
	char * label;
	int rating;
public:
	BaseDMA(const char * l = "null", int r = 0);
	// 复制构造函数
	BaseDMA(const BaseDMA & rs);
	virtual ~BaseDMA();
	// 赋值构造函数
	BaseDMA & operator=(const BaseDMA & rs);
	...
};

 声明中包含了构造函数使用new时需要的特殊方法: 析构函数, 复制构造函数和重载赋值运算符.

现在从BaseDMA派生除了LackDMA类, 而后者不使用new, 也未包含其他一些不常用的, 需要特殊处理的设计特性:

class LackDMA : public BaseDMA
{
private:
	char color[40];
public:
	...
};

这种情况不需要为LackDMA类定义显示析构函数, 复制构造函数和重载赋值运算符

因为: 调用这几个方法的时候会自动调用基类的对应的方法, 而基类的对应的方法进行了相关的操作, 而子类又没有自己的new内存的分配, 所以不需要.

 

第二种情况:派生类使用new

class HasDMA::public BaseDMA
{
private:
	// 在构造函数中使用new分配内存
	char * style;
public:
	...
};

在这种情况下必须为派生类定义显示析构函数, 复制构造函数和赋值运算符.

下面分别对这几种写法做详细讲解:

1.析构函数

派生类析构函数自动调用基类的析构函数, 故其自身的职责是对派生类构造函数执行的工作进行清理. 因此HasDMA析构函数必须释放指针style管理的内存, 并依赖于BasDMA的析构函数来释放指针label管理的内存:

BaseDMA::~BaseDMA()
{
	delete[] label;
}

HasDMA::~HasDMA()
{
	delete[] style;
}

2.复制构造函数

BaseDMA的复制构造函数遵循用于char数组的常规模式:

BaseDMA::BaseDMA(const BaseDMA & rs)
{
	label = new char[std::strlen(rs.label) + 1];
	std::strcpy(label, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值