西南科技大学C++程序设计实验七(继承与派生二)

一、实验目的

1. 掌握多继承程序设计

2. 掌握虚基类编程

3. 拓展学习可视化程序设计中的继承与派生应用

二、实验任务

重点:掌握虚基类的定义与实现,拓展其功能。

  1. 阅读分析、完善程序。下面程序(1)与程序(2)分别是没有使用虚基类和使用虚基类的代码,其中A是最上层基类,B,C是中间派生类,D是最远派生类,调试运行程序,回答程序处标注的思考题,要求:

(1)查阅资料回答程序中思考题1~3,总结程序中的二义性问题。

(2)查阅资料回答程序中思考题4~5,改写正确的派生类D有参构造函数,完成从基类A继承过来的数据成员的初始化。

(3)查阅资料回答程序中思考题6~8,总结虚基类的特点。

(4)查阅资料,了解虚指针的概念与应用。

程序(1):没有使用虚基类

#include <iostream>

using namespace std;

enum day{one,two,three};

class A   //最上层基类

{

protected:

         int a;

         day d;

public:

         A()  //无参构造函数

         {

                  cout << "A\n";

                  a = 0;

                  d = one;

         }

         A(int aa,day dd//有参构造函数

         {

                  cout << "A\n";

                  a = aa;

                  d = dd;

         }

         void showA()

         {

                  cout << "a=" << a << endl;

                  cout << "d=" << d << endl;

         }

         ~A()  //析构函数

         {

                  cout << "~A\n";

         }

};

class Bpublic A //派生类B公有继承基类A 注意:此时没有定义A为虚基类

{

private:

         string name;

public:

         B()  //无参构造函数, 注意:派生类对象调用构造函数初始化数据的顺序,先调用基类再调用派生类!

{

                  cout << "B\n";

                  name = " ";

         }

         B(int aa,day dd,string n):A(aa,dd),name(n) //有参构造函数,对从基类A继承过来的数据成员调用基类A的有参构造函数完成初始化

         {

                  cout << "B\n";

         }

         ~B()

         {

                  cout << "~B\n";

         }

         void showB()

         {

                  showA();

         }

};

class C: public A //派生类C公有继承基类A 注意:此时没有定义A为虚基类

{

protected:

         float n[10];

public:

         C()   //无参构造函数//无参构造函数, 注意:派生类对象调用构造函数初始化数据的顺序,先调用基类再调用派生类!

         {

                  cout << "C\n";

                  for (int i = 0; i < 10; i++)

                          n[i] = 0;

         }

         C(int aa, day dd, float nn[10]):A(aa,dd) //有参构造函数,对从基类A继承过来的数据成员调用基类A的有参构造函数完成初始化

         {

                  cout << "C\n";

                  for (int i = 0; i < 10; i++)

                          n[i] = nn[i];

         }

         ~C()

         {

                  cout << "~C\n";

         }

         void showC()

         {

                  showA();

         }

};

struct time {

         int year, month, day;

};

class D:public B,public C //派生类D公有继承基类 B,C思考1:此时D有没有继承基类A的数据成员a d?从B路径继承还是从C路径继承?是否存在二义性?

{

private:

         struct time bir; //结构体变量

public:

         D()

         {

                  cout << "D\n";

                  bir.year = bir.month = bir.day = 0;

         }

         D(int aa, day dd, string n, float nn[10]) :B(aa,dd,n),C(aa, dd, nn) //派生类D的有参构造函数,运行程序,思考2 D从基类A继承的数据成员a d有没有被初始化?

         {

                  cout << "D\n";

                  bir.year = bir.month = bir.day = 0;

         }

         ~D()

         {

                  cout << "~D\n";

         }

         void showD()

         {

                  showB();

                  showC();

         }

};

int main()

{

    float nn[] = { 1,2,3,4,5,6,7,8,9,10 };

    D first(10,two,"ok",nn);

    first.showD();

    cout << sizeof(A)<<endl;

    cout << sizeof(B)<<endl;

    cout << sizeof(C)<<endl;

    cout << sizeof(D)<<endl; //思考3:分析派生类D的字节数与基类AB,C的关系

    return 0;

}

程序(2):使用虚基类,但有参构造函数书写不正确

#include <iostream>

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

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

相关文章

java实现网络聊天

网络聊天实现步骤&#xff08;从功能谈论方法&#xff09;&#xff1a; 客户端&#xff1a; 1.登录面板&#xff1a;注册提醒用户注册格式&#xff0c;登录账号密码不为空&#xff0c;点击登录的时候需要连接服务器端&#xff0c;启动聊天面板。&#xff08;监听用户点击登录…

MySQL - InnoDB 和 MyISAM 的索引实现的区别

InnoDB 和 MyISAM 底层都是 B 树的实现&#xff0c;但是二者却完全不同 。 主键索引文件存储不同 MyISAM 引擎的索引文件和数据文件是分离的&#xff0c;而 InnoDB 引擎的索引文件和数据文件是不分离的。 MyISAM 引擎的叶子节点存储的是数据文件的地址&#xff0c;而 InnoDB 的…

unity 2d 入门 飞翔小鸟 死亡闪烁特效(十三)

一、c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Bling : MonoBehaviour {public Texture img;public float speed;public static bool changeWhite false;private float alpha0f;// Start is called before the fi…

【STM32】关于H743中出现的ANA类型引脚

最近调试H743ZI这个封装的H743的LAN8720功能 LAN8720是需要用一个外部引脚进行外部复位的 之前也没有好好看手册&#xff0c;选了PC2_C来做这个输出低电平复位信号的IO口 但是重点来了&#xff0c;PC2_C其实它不能做普通IO口&#xff0c;无法控制其输出高低电电平)!!! 手册上写…

nodejs微信小程序+python+PHP在线学习平台设计与实现-计算机毕业设计推荐

概念模型是对现实中的问题出现的事物的进行描述&#xff0c;ER图是由实体及其关系构成的图&#xff0c;通过E-R图可以清楚地描述系统涉及到的实体之间的相互关系。 困扰管理层的许多问题当中,在线学习也是不敢忽视的一块。但是管理好在线学习又面临很多麻烦需要解决,例如&…

流水号的获取

软件中&#xff0c;常常使用流水号&#xff0c;通常流水号是一组参数的组合&#xff0c;如&#xff1a;评估报告的编号结构&#xff1a; 区编号-机构类型-年份-性别-流水 如&#xff1a;03-01-2023-W-0001 03-01-2023-M-0002 03-01-2023-M-0003 。。。。。。 编程时&#xff0c…

有病但合理的 ChatGPT 提示语

ChatGPT 面世一年多了&#xff0c;如何让大模型输出高质量内容&#xff0c;让提示词工程成了一门重要的学科。以下是一些有病但合理的提示词技巧&#xff0c;大部分经过论文证明&#xff0c;有效提高 ChatGPT 输出质量&#xff1a; ​1️⃣ Take a deep breath. 深呼吸 ✨ 作用…

Threejs发光闪烁提示特效

一、导语 发光闪烁特效应该在我们的项目中是经常需要去封装的一个特效吧&#xff0c;一般用于点击选择&#xff0c;选中物体&#xff0c;或者一些特效加持于中心物体&#xff0c;物体碰撞检测后的发光特效等等 二、分析 我们可以合理的使用后处理特效&#xff0c;上步骤&am…

【git】关于git二三事

文章目录 前言一、创建版本库1.通过命令 git init 把这个目录变成git可以管理的仓库2.将修改的内容添加到版本库2.1 git add .2.2 git commit -m "Xxxx"2.3 git status 2.4 git diff readme.txt3.版本回退3.1 git log3.2 git reset --hard HEAD^ 二、理解工作区与暂存…

【unity实战】一个通用的FPS枪支不同武器射击控制脚本

文章目录 前言模型素材文章用到的粒子火光特效射击效果换弹瞄准开枪抖动效果设置显示文本最终代码不同武器射击效果1. 手枪2. 机枪3. 狙击枪4. 霰弹枪5. 加特林 其他感谢完结 前言 实现FPS枪支不同武器效果&#xff0c;比如手枪&#xff0c;喷子&#xff0c;狙击枪&#xff0c…

ffmpeg6.0之ffprobe.c源码分析二-核心功能源码分析

本篇我们继续分析: 1、ffprobe -show_packets 参数的处理流程;2、ffprobe -show_frames 参数的处理流程;3、ffprobe -show_streams 参数的处理流程;4、ffprobe -show_format 参数的处理流程; 因为前面的文章已经回顾了这些命令的使用,以及作用。本文就不在赘述,以免篇幅…

TeeChart.NET 2023.11.17 Crack

.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件&#xff0c;可满足无数的图表需求&#xff0c;也针对重要的垂直领域&#xff0c;例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器&#xff0c;以及完整的功能集&#xff0c…