继承与动态内存分配

继承与动态内存分配

在基类或派生类中含有指针时,要考虑内存分配情况(new与delete),还要考虑在进行对象间赋值时指针隐藏的问题(使用默认复制构造函数在析构时会造成原对象中的指针指向的内存空间被释放,为浅复制

因此需要:
1. 重载运算符’=‘、’<<‘,实现深度复制
2. 在构造函数中使用new进行动态内存分配,在析构函数中使用delete进行内存释放;
3. 将析构函数声明为虚函数

在以下代码中还有一个小技巧来简化代码,即代码重用,在后续代码中使用已定义过的代码,例如:在C的构造函数中使用已经定义过的A的构造函数,这样就可以只对C类新增的数据部分进行初始化。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;class A {
private: char *label;  //使用指针,需要动态分配内存int a;
public: A( const char* l = "null", int t = 0 );A( const A& t );virtual ~A();A& operator=( const A& t );friend ostream& operator<<( ostream& out, const A& t );
};class B : public A {
private: enum{ COL_LEN = 40 };char color[COL_LEN]; //使用数组,不需要重新分配内存
public: B( const char *c = "blank", const char *l = "null", int t = 0 );B( const char *c, const A& t );friend ostream& operator<<( ostream& out, const B& t );
};class C : public A {
private: char *style;
public: C( const char *s = "none", const char * l = "null", int t = 0 );C( const char *s, const A& t );C( const C& t );~C();C& operator=( const C& t );friend ostream& operator<<( ostream& out, const C& t );
};// A methods
A::A( const char *l, int t ) {label = new char[ strlen(l) + 1 ];strcpy( label, l );a = t;
}A::A( const A& t ) {label = new char[ strlen(t.label) + 1 ];strcpy( label, t.label );a = t.a;
}A::~A() {delete[] label;
}A& A::operator=( const A& t ) {/* 若为同一对象,则直接返回,否则会将该对象内容delete,无法复制 */if ( this == &t ) {return *this;}delete[] label;  //先释放原内存空间label = new char[ strlen(t.label)+1 ];strcpy( label, t.label );a = t.a;return *this;
}ostream& operator<<( ostream& out, const A& t ) {out << "label = " << t.label << ", a = " << t.a << endl;return out;
}// B methods
B::B( const char *c, const char *l, int t ) : A( l, t ) {strcpy( color, c );
}B::B( const char *c, const A& t ) : A(t) {strcpy( color, c );
}ostream& operator<<( ostream& out, const B& t ) {out << ( const A& )t;out << "color = " << t.color << endl;return out;
}// C methods
C::C( const char *s, const char *l, int t ) : A( l, t ) {style = new char[ strlen(s)+1 ];strcpy( style, s );
}C::C( const char *s, const A& t ) : A( t ) {style = new char[ strlen(s)+1 ];strcpy( style, s );
}C::C( const C& t ) : A(t) {style = new char[ strlen(t.style)+1 ];strcpy( style, t.style );
}C::~C() {delete[] style;
}C& C::operator=( const C& t ) {if ( this == &t ) {return *this;}A::operator=(t); //调用A类的赋值函数初始化,相当于 *this = t;delete[] style;style = new char[ strlen(t.style)+1 ];strcpy( style, t.style );return *this;
}ostream& operator<<( ostream& out, const C& t ) {out << ( const A& )t;  //类型强转,使用A类的<<运算符重载函数out << "style = " << t.style << endl;return out;
}int main() {A shirt( "portabelly", 8 );B balloon( "red", "Blimpo", 4 );C map( "Mercator", "Buffalo", 5 );cout << "A:\n" << shirt << endl;cout << "B:\n" << balloon << endl;cout << "C:\n" << map << endl;B balloon2(balloon);cout << "balloon2:\n" << balloon2 << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再谈VC++中ListControl排序[原创]

2005.01.05发表于blog.csdn.net/zxub  昨天做了ListControl中的排序功能&#xff0c;但是使用后&#xff0c;发现只有在第一次数据完全没排序的时候&#xff0c;排序才是正确的&#xff0c;仔细看了下排序用到的回调函数&#xff1a;  int CALLBACK CStaMDiag::CompareFunc…

uva 11572 ——Unique Snowflakes

题意&#xff1a;给定一个序列&#xff0c;然后在这个序列找到一个连续的串&#xff0c;使得串中没有重复的元素。 思路&#xff1a;单调队列。每次都把该在序列没出现的数加入到序列中&#xff0c;然后向后扫描找到最大的ans。 code&#xff1a; //#incllude <bits/stdc.h&…

使用.NET类库操作CSV文件

CSV文件&#xff0c;是指使用逗号对数据进行分割的文本数据文件。昨天有人提出了一个问题&#xff0c;就是怎么对CSV文件进行操作&#xff0c;并且给出了一个类的定义。我根据这个类定义实现了一个能够读些CSV文件的类。由于涉及到了字符串操作&#xff0c;为了提高查询、替换性…

uva 11054——Wine trading in Gergovia

题意&#xff1a;有n个村庄&#xff0c;每个村庄要么买酒&#xff08;&#xff09;&#xff0c;要么卖酒&#xff08;-&#xff09;&#xff0c;要求供需平衡&#xff0c;求最小代价&#xff08;代价k为把k个单位的酒运到相邻的村庄&#xff09;。 思路&#xff1a;贪心。可以把…

uva 1312——Cricket Field

题意&#xff1a;在w*h的方格内&#xff0c;找出一个最大的正方形&#xff0c;使得正方形内没有点&#xff08;可以在边界有点&#xff09;。 思路&#xff1a;枚举。正方形可以看作是矩形&#xff0c;只不过在取的时候取最短的那条边作为边长&#xff0c;那么枚举出短边最大的…

【操作系统】页面置换算法

页面置换算法 在进程运行过程中&#xff0c;若需要访问的物理块不在内存中&#xff0c;就需要通过一定的方式来将页面载入内存&#xff0c;而此时内存很可能已无空闲空间&#xff0c;因此就需要一定的算法来选择内存中要被置换的页面&#xff0c;这种算法就被称为页面置换算法。…

uva 1617——Laptop

题意&#xff1a;有n个长度为1的线段&#xff0c;确定它们的起点&#xff0c;使得第i个线段在【ri&#xff0c;di】之间&#xff0c;输出空隙数目的最小值。 思路&#xff1a;贪心。首先对区间进行排序&#xff0c;然后扫描一遍&#xff0c;当上一个线段最右边加1《当前最左的点…

ubuntu18.04安装、配置dosbox

1 安装dosbox&#xff1a;打开终端&#xff0c;输入&#xff1a; sudo apt install dosbox 2 安装完成后&#xff0c;启动dosbox&#xff0c;在终端输入&#xff1a; dosbox 3 设置自动挂载 退出dosbox&#xff0c;在终端中输入&#xff1a; vim .dosbox/dosbox-0.74.con…

关于 SENDKEYS 的代码

sendkeys 的用法&#xff08;MSDN&#xff09;&#xff1a; SendKeys 语句 将一个或多个按键消息发送到活动窗口&#xff0c;就如同在键盘上进行输入一样。 语法 SendKeys string[, wait] SendKeys 语句的语法具有以下几个命名参数&#xff1a; 部分描述string必需的。字符串表…

uva 1615——Highway

题意&#xff1a; 给定平面上n个点&#xff0c;和一个值D&#xff0c;要求在x轴上选出尽量少的点&#xff0c;使得对给定的点&#xff0c;都有一个点离他的欧几里德距离步超过D。 思路&#xff1a;区间覆盖问题。以平面上的点为圆心&#xff0c;以D为半径&#xff0c;求出来一个…

解决linux写入ntfs盘时报错:只读文件系统

[2018.10.28 更新] 可能因为在挂载wimdows盘后&#xff0c;强制关机造成的&#xff0c;可使用 sudo ntfsfix /dev/*** 来修复。其中&#xff0c;***为具体哪个盘&#xff0c;例如sudo ntfsfix /dev/sda4 之前一直可以对windows盘进行读写操作&#xff0c;但今天突然不能用了&am…

家里装AD了

通过关系&#xff0c;家里终于装上了ADSL&#xff0c;而且还是130包月的&#xff0c;还免了调测费转载于:https://www.cnblogs.com/d9394/archive/2005/09/28/10611828.html

uva 1613——K-Graph Oddity

题意&#xff1a;输入n个点m条边的联通图&#xff0c;n为奇数&#xff0c;设k为最小的奇数&#xff0c;使得每个点的度数不超过k&#xff0c;要求把节点都涂上颜色&#xff0c;使得相邻节点颜色不一样。 思路&#xff1a;dfs。k的值为奇数&#xff0c;所以k为节点最大度数&…

应用ADO.net得到表

----------------------------------------------------------开发者&#xff1a;开发时间&#xff1a;2004.9.9功能&#xff1a;应用ADO.net得到表----------------------------------------------------------Imports Zy_DataAccessImports SystemImports System.DataImports…

uva 11093——Just Finish it up

题意&#xff1a;环形跑道上有n个加油站&#xff0c;每个站可以加pi单位的油&#xff0c;从当前站开到下一站需要qi的油&#xff0c;问是否能够环游一圈。 思路&#xff1a;枚举。首先如果总需求量>总供给量&#xff0c;那么不可能。否则就枚举起点&#xff0c;如果油箱里的…

【计算机网络】TCP IP通信处理过程

1.数据包首部 每个分层中都会对所发送的数据附加一个首部&#xff0c;其中包含了该层必要的信息&#xff0c;如发送端地址、接收端地址以及协议等相关信息。 2.发送数据包 1&#xff09;应用程序处理 进行编码处理&#xff08;相当于表示层功能&#xff09;&#xff0c;管…

感觉自己越来越浮躁

重新审视自己的技术走向&#xff0c;不得不承认&#xff0c;越来越向上层迈进。但是这不是我喜欢的&#xff0c;一味的追求快速开发&#xff0c;希望自己的开发速度能一个人顶10个人&#xff0c;但是往往容易在项目中迷失自己&#xff0c;很希望能快点结束这段噩梦般的项目&…

uva 12627——Erratic Expansion

题意&#xff1a;一开始有1个红气球&#xff0c;每小时一个红气球都会变成3个红气球和1个蓝气球&#xff0c;1个蓝气球会变成4个蓝气球&#xff0c;问k个小时后a行到b行的红气球的数量。 思路&#xff1a;递推。a为偶数时&#xff0c;计算a1到b以及a本行的红气球数。b为奇数时&…

【计算机网络】数据链路相关技术

1.MAC地址 MAC地址长48字节。在使用网卡的情况下&#xff0c;一般会将MAC地址烧入到ROM中&#xff0c;任何一个网卡的MAC地址都是唯一的。例如 00:10:5A:70:33:61 MAC地址的3~24位表示厂商识别码&#xff0c;每个NIC厂商都有特定唯一的识别数字。25~48位是厂商内部为识别每个…

uva 714——Copying Books

题意&#xff1a;把一个m个整数的序列划分成k个连续非空的子序列&#xff0c;使得子序列和的最大值最小。 思路&#xff1a;二分。遇到最大值最小大多都二分了&#xff0c;让划分的子序列都不超过x&#xff0c;根据x来judge最终结果k个是多还是少&#xff0c;然后二分来调整x直…