西南科技大学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.mzph.cn/news/203193.shtml

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

相关文章

【二分答案法】寻找峰值

题目&#xff1a;162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 题目分析&#xff1a; &#xff08;1&#xff09;据题知&#xff0c;索引-1、索引n&#xff08;n为数组长度&#xff09;处的元素都默认为无穷小&#xff0c;我们可以在一开始特判…

SLAM算法与工程实践——SLAM基本库的安装与使用(2):OpenCV库

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

RabbitMQ创建新用户,并给用户添加角色和授权

一、进入容器 1.1 查看运行容器的详细信息 docker ps -a1.2 进入容器命令 docker exec -it 容器ID /bin/bash 或 docker exec -it 容器name bash 1.3 退出容器命令 exit 或者 CtrlQP 二、操作RabbitMQ 2.1 查看用户列表 注:先进入到容器内部 rabbitmqctl list_user…

SQL语言重温

数据库语言重温 笔记背景SQL教程一些最重要的 SQL 命令SQL WHERE 子句SQL AND & OR 运算符SQL ORDER BY 关键字 笔记背景 由于工作需要&#xff0c;现重温简单SQL语言&#xff0c;笔记记录如下。 SQL教程 SQL&#xff08;Structured Query Language:结构化查询语言&…

【PyTorch】权重衰减

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现 1. 理论介绍 通过对模型过拟合的思考&#xff0c;人们希望能通过某种工具调整模型复杂度&#xff0c;使其达到一个合适的平衡位置。权重衰减&#xff08;又称 L 2 L_2 L2​正则化&#xff09;通过为损失函数添加惩…

uni-app 微信小程序之加载行政区图

文章目录 1. 实现效果2. 实现步骤 1. 实现效果 2. 实现步骤 使用三方组件 ucharts echarts 高性能跨全端图表组件页面导入引入的三方组件 组件demo代码 <template><view class"qiun-columns"><view class"cu-bar bg-white margin-top-xs"…

文献阅读:基于改进ConvNext的玉米叶片病害分类

文献阅读&#xff1a;基于改进ConvNext的玉米叶片病害分类 CBAM注意力机制模块&#xff1a; 1&#xff1a;通道注意力模块&#xff0c;对输入进来的特征层分别进行全局平均池化&#xff08;AvgPool&#xff09;和全局最大池化&#xff08;MaxPool&#xff09;&#xff08;两个…

可视化监控云平台/智能监控平台EasyCVR国标设备开启音频没有声音是什么原因?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。GB28181视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存…

ROS-ROS通信机制-参数服务器

文章目录 一、基础理论知识二、C实现三、Python实现 一、基础理论知识 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点…

多人聊天UDP

服务端 package 多人聊天;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;…

零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享

零基础小白怎么准备蓝桥杯-蓝桥杯竞赛经验分享 前言竞赛简介竞赛目的如何备战1.基础学习2.实战训练&#xff08;非常重要&#xff09; 资料分享 前言 博主在蓝桥杯中获得过十四届Java B 组的省一国二&#xff0c;本文为大家介绍一下蓝桥杯并分享一下自己的参赛经验。 竞赛简介…

封装校验-----Vue3+ts项目

登录校验页面 <script setup lang"ts"> import { ref } from vue import { mobileRules, passwordRules } from /utils/rules const mobile ref() const password ref() </script><!-- 表单 --><van-form autocomplete"off">&l…

数位统计DP

数位DP 数位&#xff08;digit&#xff09;指的是一个数字中的每一位。例如&#xff0c;对于整数1234来说&#xff0c;它有四个数位&#xff0c;分别是1、2、3和4。在数位统计 DP 中&#xff0c;我们通常将数字拆解成各个数位&#xff0c;并使用这些数位进行状态定义和转移。通…

电脑设置代理IP,上网怎么使用代理

在我们的日常生活中&#xff0c;代理IP的使用越来越常见。当我们需要隐藏自己的真实IP地址时&#xff0c;代理IP就成为了我们的不二选择。那么&#xff0c;如何设置代理IP来固定上网地址呢&#xff1f;本文将详细介绍代理IP的设置方法以及如何使用代理IP固定上网地址。 一、代…

Failed to connect to github.com port 443 after 21055 ms: Timed out

目前自己使用了梯*子还是会报这样的错误&#xff0c;连接不到的github。 查了一下原因&#xff1a; 是因为这个请求没有走代理。 解决方案&#xff1a; 设置 -> 网络和Internet -> 代理 -> 编辑 记住这个IP和端口 使用以下命令&#xff1a; git config --global h…

Kafka集群调优

一、前言 我们需要对4个规格的kafka能力进行探底&#xff0c;即其可以承载的最大吞吐&#xff1b;4个规格对应的单节点的配置如下&#xff1a; 标准版&#xff1a; 2C4G铂金版&#xff1a; 4C8G专业版&#xff1a; 8C16G企业版&#xff1a; 16C32G 另外&#xff0c;一般来讲…

git 分支的创建与删除

一 创建本地分支 git checkout -b codetwo //创建本地分支 codetwo git branch newcode //创建本地分支newcode创建的分支如下图&#xff1a; 用checkout的方式创建&#xff0c;只是创建的同时还切换到了这个本地分支 二 创建远程分支 git branch newcode //创…

ALPHA开发板烧录工具MfgTool烧写原理

一. 简介 MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件&#xff0c;可以在 NXP 官网下载到。运行在windows下。可以烧写uboot.imx、zImage、dtb&#xff0c;rootfs。通过 USB口进行烧写。 上一篇文章简单了解了 烧录工具MfgTool &#xff08;针对ALPH…

TrustZone之数据、指令和统一缓存(unified caches)

在Arm架构中,data caches是物理标记(physically tagged)的。物理地址包括该行来自哪个地址空间,如下所示: 对于NP:0x800000的缓存查找永远不会命中使用SP:0x800000标记的缓存行。这是因为NP:0x800000和SP:0x800000是不同的地址。 这也影响缓存维护操作。考虑前面图表中的示…

人工智能学习8(集成学习之xgboost)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm 集成学习XGBoost(Extreme Gradient Boosting)极端梯度提升树1.最优模型的构建方法XGBoost目标函数案例1&#xff1a;泰坦尼克号案例2&#xff1a;对奥拓集团差评进行正确分类。数据准备&#xff1a;1.第一种…