博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
含动态分配内存的类的声明和定义以及继承
阅读量:6209 次
发布时间:2019-06-21

本文共 1997 字,大约阅读时间需要 6 分钟。

          假设基类base,派生类derive1,derive2. 其中前2者含有指针成员(自动分配内存),后者不含。

1.声明

         三者声明如下:

#include"iostream"#include"string"using namespace std;//含有动态分配内存的基类class base{public:	base(const char* pointer=NULL);	base(const base&);	base& operator=(const base&);	friend ostream& operator <<(ostream& ,const base&);	virtual ~base(){	   if(p)	    delete []p;	}private:	char* p;};//含有动态分配内存的派生类class derive1 :public base{	public:	derive1(const char* pointer1=NULL,const char* pointr2=NULL);	derive1(derive1&);	derive1& operator=(const derive1&);	friend ostream& operator <<(ostream&,const derive1&);	~derive1(){	   if(q)	    delete []q;	}private:	char* q;};//不含动态分配内存的派生类class derive2 :public base{	public:	derive2(const string& ,const char* pointer=NULL);	derive2(const derive2&);	friend ostream& operator <<(ostream&,const derive2&);private:	string q;};
  

     对于基类base:                                                          (1)需要重载拷贝构造函数和赋值运算符。          (2)析构函数声明为虚函数。当派生类也具有自动分配内存时,基类指针指向派生类对象时,将调用派生类的析构函数(继而调用基类析构函数)释放所有内存。这样避免了内存泄露

     对于derive1:public base的情况:          (1)需要重载拷贝构造函数,且显式调用基类拷贝构造函数构造基类部分;          (2)需要重载赋值运算符,且其中,使用base::operator=(d);显式地调用基类赋值运算符复制基类部分          (3)倘若需要重载输出运算符。其中需要显式的使用类型转换out<<(const base&)d;输出基类数据,然后再输出派生类的数据

对于derive2:public base的情况:          (1)不需要重载拷贝构造函数,其中对于基类的自动分配内存的拷贝自动调用基类中已经重载的拷贝构造函数。         (2)需要在输出运算符重载时,显式转换且输出基类数据。

2.定义

#include"declaration.h"/************************基类base定义*****************************/base::base(const char* pointer){//构造函数	if(!pointer)		p=NULL;	else{	   p=new char[strlen(pointer)+1];	   strcpy(p,pointer);	}}base::base(const base& b){//拷贝构造函数	p=new char[strlen(b.p)+1];	strcpy(p,b.p);}base& base::operator=(const base& b){//重载赋值函数	if(this==&b)		return *this;	if(p){		delete[]p;		p=NULL;	}	p=new char[strlen(b.p)+1];	strcpy(p,b.p);	return *this;}ostream& operator <<(ostream& out,const base& b){//重载输出运算符	if(b.p)		cout<
<
       注意:编译时,只需包含声明文件“declaration.h”即可,否则会显示link2005的重定义错误。

转载于:https://www.cnblogs.com/engineerLF/p/5393038.html

你可能感兴趣的文章
App开发中甲乙方冲突会闹出啥后果?H5 APP 开发可以改变现状吗
查看>>
怎么恢复MySQL数据库
查看>>
mysql导出xls的格式
查看>>
我的友情链接
查看>>
调试九法
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
mybatis insert语句 返回插入的记录的主键值
查看>>
Dedecms系统实现按“字母检索”搜索功能
查看>>
1028-WEB Navigation
查看>>
安全Lab
查看>>
我的友情链接
查看>>
Spring学习总结(4)——Spring AOP教程
查看>>
iOS开发网络篇—NSURLConnection基本使用
查看>>
fstab文件说明
查看>>
commons-pool2源码分析evictor
查看>>
Ant——学习(1):初步了解
查看>>
MacOS Sierra升级问题小记
查看>>
在苹果MAC OS X Lion系统上使用系统自带程序配置Exchange邮箱
查看>>
易宝典文章——玩转Office 365中的Exchange Online服务 之十五 怎样管理Exchange Online的动态通讯组...
查看>>