实验目的

1.掌握派生类的声明方法和派生类构造函数的定义方法
2.掌握不同方式下,构造函数与析构函数的执行顺序与构造规则

一、派生类的构造函数与析构函数

 派生类继承了基类的成员,实现原有代码的重用,但是引入继承的更主要的目的是代码的扩充,只有在派生类中通过增加新的成员,加入新的功能,类的派生才有实际意义。但是基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就需要加入派生类的构造函数。

通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤销派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。

二、实验内容

1.

#include "sy6.h"using namespace std;class MyArray {public:MyArray(int length);~MyArray();void Input();void Display(string);
protected:int* alist;int length;
};MyArray::MyArray(int leng)
{if (leng <= 0){cout << "error length";exit(1);}length = leng;alist = new int[length];if (alist == NULL){cout << "assign failure";exit(1);}cout << "MyArray类对象已创建!" << endl;
}MyArray::~MyArray()
{delete[] alist;cout << "MyArray类对象已撤销!" << endl;
}
void MyArray::Display(string str)
{int i;int* p = alist;cout << str << length << "个整数:";for (i = 0; i < length; i++, p++){cout << *p << " ";}cout << endl;
}
void MyArray::Input()
{cout << "请从键盘输入" << length << "个整数:";int i;int* p = alist;for (i = 0; i < length; i++, p++){cin>>*p;}
}
int main()
{//SortArray a(5);MyArray a(5);a.Input();a.Display("显示已经输入的");//a.Sort();return 0;
}

实验结果

2.

声明一个SortArray继承MyArray,在该类中定义一个函数,具有将输入回来整数从小到大进行排序的功能

#include "sy6.h"using namespace std;class MyArray {public:MyArray(int length);~MyArray();void Input();void Display(string);
protected:int* alist;int length;
};class SortArray :public MyArray {public:SortArray(int length):MyArray(length) {cout << "SortArray类对象已创建!" << endl;}~SortArray(){cout << "SortArray类对象已撤销!" << endl;}void Sort();
};MyArray::MyArray(int leng)
{if (leng <= 0){cout << "error length";exit(1);}length = leng;alist = new int[length];if (alist == NULL){cout << "assign failure";exit(1);}cout << "MyArray类对象已创建!" << endl;
}MyArray::~MyArray()
{delete[] alist;cout << "MyArray类对象已撤销!" << endl;
}
void MyArray::Display(string str)
{int i;int* p = alist;cout << str << length << "个整数:";for (i = 0; i < length; i++, p++){cout << *p << " ";}cout << endl;
}
void MyArray::Input()
{cout << "请从键盘输入" << length << "个整数:";int i;int* p = alist;for (i = 0; i < length; i++, p++){cin>>*p;}
}void SortArray::Sort()
{int i;int j;int temp = 0;int *p = alist;int *q = alist;cout << "显示排序以前的" << length << "个整数:";for (i = 0; i < length; i++, p++){cout << *p << " ";}cout <<endl<< "显示排序以后的" << length << "个整数:";for (i = 0; i < length; i++){for (j = i; j < length; j++){if (*(q + j) < *(q + i)){temp = *(q + i);*(q + i) = *(q + j);*(q + j) = temp;}}cout << *(q + i)<<" ";}cout << endl;
}int main()
{SortArray a(5);//MyArray a(5);a.Input();//a.Display("显示已经输入的");a.Sort();return 0;
}

实验结果

出现的错误

在进行排序输出时出现了这样的错误,原因是出现了地址溢出,在声明派生类的对象时,初始化参数为5,故就分配了这些地址,而在程序中应该是使用的地址范围超过了定义的范围,据此思路寻找原因。

void SortArray::Sort()
{int i;int j;int temp = 0;int *p = alist;//用来输出排序前的数int *q = alist;//用来输出排序后的数,防止溢出cout << "显示排序以前的" << length << "个整数:";for (i = 0; i < length; i++, p++){cout << *p << " ";}cout <<endl<< "显示排序以后的" << length << "个整数:";for (i = 0; i < length; i++){for (j = i; j < length; j++){if (*(q + j) < *(q + i)){temp = *(q + i);*(q + i) = *(q + j);*(q + j) = temp;}}cout << *(q + i)<<" ";}cout << endl;
}
 发现原来在之前输出排序前的数字时使用的指针变量p,仍旧不加任何处理,在p++5次的基础上又进行排序处理和输出,导致了地址溢出。解决方法是又增加了一个指针变量,用来排序和输出,实现了想要的结果。
MyArray::MyArray(int leng)
{if (leng <= 0){cout << "error length";exit(1);}//length = leng;alist = new int[length];//使用了未初始化的变量length = leng;if (alist == NULL){cout << "assign failure";exit(1);}cout << "MyArray类对象已创建!" << endl;
}

而使用了未进行初始化的变量也会造成这样的结果。
该问题的描述

实验7-继承下的构造函数与析构函数相关推荐

  1. 实验七:继承下的构造函数与析构函数

    一.实验目的: 二.实验内容: #include "twj.h"using namespace std;class MyArray { public:MyArray(int len ...

  2. 6.继承下的构造函数域析构函数

    实验目的:1.掌握派生类的声明方法和派生类构造函数的定义方法 2.掌握不同方式下,构造函数与析构函数的执行顺序与构造规则 运行结果: 结果很明显:基类的构造函数先运行,派生类的构造函数后运行 结束时, ...

  3. C++:继承中的构造函数和析构函数

    C++:继承中的构造函数和析构函数 1.继承中构造函数和析构函数调用顺序 a.调用父类构造函数: b.调用其他成员的构造函数: c.调用子类构造函数: d.析构调用顺序相反. #include < ...

  4. 7-15 单继承中的构造函数与析构函数 (10 分)

    7-15 单继承中的构造函数与析构函数 (10 分 编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一 ...

  5. 面向对象编程实验课随笔(承继下的构造函数和析构函数)

    一.试验内容 1.将示例代码用电脑运行,并展示运行结果. 2.声明一个SortArray继承类MyArray,在类中定义一个函数,具有将输入的整数从小到大进行排序的功能. 二.试验步骤 1.运行示例代 ...

  6. 类继承中的构造函数与析构函数

    构造函数初始化列表 子类的初始化列表,只能对子类的成员变量进行初始化 class Base{ public:int x; };class Derived : public Base { public: ...

  7. 继承关系中构造函数、析构函数的调用顺序详解

    构造函数: 在c++中,当声明一个派生类的对象时,派生类中包含所有父类的数据成员以及自己添加的数据成员均已被分配了内存,只是尚未进行初始化配置(但实际上基本数据类型的变量已经被赋予随机默认值). 构造 ...

  8. 单继承中的构造函数与析构函数

    编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一个private的数据成员半径float r 和一个 ...

  9. PTA:单继承中的构造函数与析构函数(c++,继承)

    编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一个private的数据成员半径float r 和一个 ...

最新文章

  1. 如何实现一个定时的任务,并且可以自己停止
  2. 相对布局(RelativeLayout)
  3. linux fedora kde桌面设置全局显示字体大小
  4. redis 相关操作
  5. [Java基础]IO流概述和分类
  6. php中mysql_connect与mysql_pconnect的区别
  7. DOCTYPE 声明
  8. Flutter APP UI Components
  9. ubuntux学习日记
  10. Java面向对象之多态(向上、向下转型) 入门实例
  11. Beta冲刺Day4
  12. 编程珠玑是基于c语言写的吗,编程珠玑:变位词集
  13. VRRP配置与维护手册-1
  14. 在线文本加密解密工具
  15. 2008服务器系统开启ftp,2008服务器开启ftp服务
  16. 大白话 同步阻塞、同步非阻塞、异步非阻塞
  17. oppo手机文件共享媒体服务器,网件:ReadyNAS特色功能之媒体服务器
  18. Python:使用cv2模块快速生成素描
  19. 爬取沪江网考研词汇并按要求存为txt
  20. Your endpoint configuration is wrong

热门文章

  1. Google对simhash的用法论文读书笔记
  2. Git版本控制系统之基本使用
  3. python导入模块错误
  4. 选择一幅灰度图像,用Matlab编程计算该图像的灰度均值、方差和熵。
  5. 数据库服务器资源使用周报
  6. 应收、应付、预收、预付 会计分录
  7. 一文学会基因型和表型关联分析算法GEMMA
  8. Python-01基础-00菜鸟教程
  9. PCA-手写字体图片识别
  10. 图片还原去遮挡_[转摘]图像复原(图片去噪与去模糊)-低级图像处理/视觉任务