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

news/2024/5/12 12:27:49/文章来源:https://blog.csdn.net/Myon5/article/details/134827158

一、实验目的

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.luyixian.cn/news_show_191145.aspx

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

相关文章

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

【Python】 生成二维码

创建了一个使用 python 创建二维码的程序。 下面是生成的程序的图像。 功能描述 输入网址&#xff08;URL&#xff09;。 输入二维码的名称。 当单击 QR 码生成按钮时&#xff0c;将使用 QRname 中输入的字符将 QR 码生成为图像。 程序代码 import qrcode import tkinterd…

使用dockerfile 构建自己的nacos-mysql

前言 在部署nacos的时候触发的脑袋灵光一闪&#xff0c;每次部署nacos都要部署下mysql服务器&#xff0c;然后导入sql语句&#xff0c;配置nacos配置文件&#xff0c;那有没有简单的方法实现一键部署nacos和nacos-mysql 呢? 答案是肯定&#xff01;如下目录图&#xff1a; …

Navicat 技术指引 | 适用于 GaussDB 分布式的用户/权限功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

Navicat 技术指引 | 适用于 GaussDB 分布式的查询功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

Android 等待view 加载布局完成 (包括动态生成View)

前言 在实际开发中&#xff0c;有很多组件需要 根据数据&#xff0c;动态生成&#xff0c;或者 追加 / 减少 子view&#xff0c;由于View布局需要时间&#xff0c;此时想要获取父View的最新宽高值&#xff0c;要么手动测量&#xff0c;要么等待布局完成后再获取&#xff1b; …

使用 Axios 进行网络请求的全面指南

使用 Axios 进行网络请求的全面指南 本文将向您介绍如何使用 Axios 进行网络请求。通过分步指南和示例代码&#xff0c;您将学习如何使用 Axios 库在前端应用程序中发送 GET、POST、PUT 和 DELETE 请求&#xff0c;并处理响应数据和错误。 准备工作 在开始之前&#xff0c;请…

Navicat 技术指引 | 连接 GaussDB 分布式

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

【每日一题】下一个更大的数值平衡数

Tag 【模拟】【取模运算】 题目来源 2048. 下一个更大的数值平衡数 解题思路 方法一&#xff1a;模拟 思路 观察到数据量 0 < n < 1 0 6 0< n <10^6 0<n<106&#xff0c;我们可能返回的数值平衡数最大是 1224444&#xff0c;这个范围可以在时间要求内…

高效的多维空间点索引算法——GeoHash

一、Geohash 算法简介 GeoHash是空间索引的一种方式&#xff0c;其基本原理是将地球理解为一个二维平面&#xff0c;通过把二维的空间经纬度数据编码为一个字符串&#xff0c;可以把平面递归分解成更小的子块&#xff0c;每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方…

多人聊天Java

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ public static ServerSocket server_socket; public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []ar…

将单体应用程序迁移到微服务

多年来&#xff0c;我处理过多个单体应用&#xff0c;并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略&#xff0c;以实现成功的迁移。在这篇文章中&#xff0c;我将以AWS为例&#xff0c;但基本原则保持不变&#xff0c;可用于任何类型的基…

web前端之css变量的妙用、通过JavaScrip改变css文件中的属性值、querySelector、setProperty

MENU 效果图htmlJavaScripstylequerySelectorsetProperty 效果图 html <div id"idBox" class"p_r w_680 h_160 b_1s_red"><div id"idItem" class"p_a l_0 t_30 w_100 h_100 bc_rgba_255_00_05 radius_50_"></div> …

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚&#xff0c;指的是云计算、大数据和人工智能&#xff0c;在人工智能&#xff08;AI&#xff09;快速发展的当下&#xff0c;例如常见的大数据分析、人工智能芯片生产的智能机器人等等&#xff0c;在工作、生活、教育、金融、科技、工业、农业、娱…

Embedding And Word2vec

Embedding与向量数据库&#xff1a; Embedding 简单地说就是 N 维数字向量&#xff0c;可以代表任何东西&#xff0c;包括文本、音乐、视频等等。要创建一个Embedding有很多方法&#xff0c;可以使用Word2vec&#xff0c;也可以使用OpenAI 的 Ada。创建好的Embedding&#xff…

优化记录 -- 记一次搜索引擎(SOLR)优化

业务场景 某服务根据用户相关信息&#xff0c;使用搜索引擎进行数据检索 软件配置 solr 1台&#xff1a;32c 64g 数据10gb左右&#xff0c;版本 7.5.5 应用服务器1台&#xff1a;16c 64g 应用程序 3节点 问题产生现象 1、因业务系统因处理能不足&#xff0c;对业务系统硬件…

k8s引用环境变量

一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充&#xff1a; k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注&#xff1a; configMapKeyRef、fieldRef 和 resour…

第十五届蓝桥杯模拟赛B组(第二期)C++

前言&#xff1a; 第一次做蓝桥模拟赛的博客记录&#xff0c;可能有很多不足的地方&#xff0c;现在将第十五届蓝桥杯模拟赛B组&#xff08;第二期&#xff09;的题目与代码与大家进行分享&#xff0c;我是用C做的&#xff0c;有好几道算法题当时自己做的也是一脸懵&#xff0c…

房产中介管理信息系统的设计与实现

摘 要 随着房地产业的开发&#xff0c;房产中介行业也随之发展起来&#xff0c;由于房改政策的出台&#xff0c;购房、售房、租房的居民越来越多&#xff0c;这对房产中介部门无疑是一个发展的契机。本文结合目前中国城市房产管理的实际情况和现阶段房屋产业的供求关系对房产中…