西南科技大学C++程序设计实验八(多态一)

一、实验目的

1. 掌握多态性的分类;

2. 动态多态性-虚函数;

3. 理解纯虚函数的概念。

二、实验任务

1.分析以下程序,改正程序错误,写出程序输出结果,并按要求:

(1)思考:输出结果中为什么类A是8个字节,类B是12个字节?分析虚函数的类的结构特点

A的字节大小为: 4int+4 (v_ptr)=8  B的字节大小为: 4int+4int+4 (v_ptr)=12

(2)回答程序中标注的思考题1-5,总结虚函数的调用为什么要用基类对象指针?基类对象指针与派生类对象指针的使用区别是什么?

为什么要用基类对象指针:

当一个派生类对象赋值给基类指针或引用的时候,该指针或引用将指向派生类对象中的虚函数表指针。

在程序执行时,通过基类指针或引用调用虚函数,会调用派生类中的该函数,这种行为被称为动态绑定或动态多态性。

基类对象指针与派生类对象指针的使用区别:

可以将一个父类指针指向一个子类对象,但不能子类指针能否指向父类对象,因为子类中有些信息父类没有,如果用子类指针访问的时候很可能访问到父类没有的一些属性及函数,会出错!

#include <iostream>
using namespace std;
class A
{
public:
    int a;
    A()   {a=2;}
    int geta()          {return a; }
    virtual void show()           {cout<<"a="<<a<<endl; }
};
class B:public A
{
public:
    int b;
    B(){b=6;}
    int getb(){        return b;   }
     void show()
     {
        A::show();
        cout<<"b="<<b<<endl;
    }
};
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    A first,*p1;
    B second,*p2;
    cout<<"sizeof(A)="<<sizeof(A)<<"  sizeof(p1)="<<sizeof(p1)<<endl; //思考:输出结果?
    cout<<"sizeof(B)="<<sizeof(B)<<" sizeof(p2)="<<sizeof(p2)<<endl;
    p1=&second//基类对象指针指向派生类对象
    p1->show();  //思考1:此时指针调用的是派生类中的show()函数还是基类中的?
    cout<<p1->geta()<<endl//思考2:程序是否能够正确输出?得出什么结论?
    cout<<p1->getb()<<endl;  //思考3:程序是否能够正确输出,若不能正确输出,为什么?
    p2=&second; //派生类对象指针指向派生类对象
    cout<<p2->geta()<<endl//思考4:程序是否能够正确输出?得出什么结论?
    cout<<p2->getb()<<endl//思考5:程序是否能够正确输出,若不能正确输出,为什么?
    return a.exec();
}

实验思考题回答与结果分析:

(1)在X86的条件下,sizeof:A为8  sizeof:B 为4;

(2)此时调用的是派生类的show()函数

(3)程序可以正常输出,p1为基类指针,可以访问基类的非虚构函数

(4)不能,p1为基类指针不能访问派生类中的非虚函数

(5)程序能够正确输出,p2为派生类指针。继承了基类中的geta()非成员函数,可以直接调用

(6)程序能够正确输出,p2可以直接getb()非成员函数

2、分析以下程序,写出程序运行结果,说明为什么要把析构函数声明为虚函数,要求:

  1. 分别将析构函数定义为虚函数,非虚函数两种情况调试程序。

当将析构函数定义为虚函数,基类与派生类函数全都得到了析构

将析构函数定义为非虚函数,派生类没有析构

 

  1. 思考如果把A类中的析构函数前的virtual去掉(即不声明为虚析构函数),通多基类对象指针是否会正确释放派生类对象所占内存?

不能

 
#include <iostream>
using namespace std;
class A
{
public:
    A(){}
    virtual~A()
    {
        cout<<"Delete class A\n";
    }
};
class B : public A{
public:
    B(){}
    ~B()
    {
        cout<<"Delete class B\n";
    }
};

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

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

相关文章

Android studio安装教程(图文详解,简单搞定)

一 下载 根据自己计算机选择对应版本点击下载 https://developer.android.google.cn/studio 二 安装Android Studio Android Studio 是Google提供的一个Android开发环境&#xff0c;基于IntelliJ IDEA类似 Eclipse ADT&#xff0c;他集成了Android 所需的开发工具。需要注意…

企业快递账单管理教程

快递账单管理怎么做&#xff0c;才能更高效&#xff1f;想要回答这个问题&#xff0c;首先我们要了解现如今企业快递账单管理的大致有哪些方式&#xff1a; 1、纸质化管理 纸质化管理现在虽然少见&#xff0c;但是我们应该挺熟悉。在电子面单面试之前&#xff0c;企业快递账单…

数据结构线性表-栈和队列的实现

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 …

Python与ArcGIS系列(十五)根据距离抓取字段

目录 0 简述1 实例需求2 arcpy开发脚本0 简述 在处理gis数据的时候,会遇到这种需求:将一个图层与另一个图层中相近的要素进行字段赋值。本篇将介绍如何利用arcpy及arcgis的工具箱实现这个功能。 1 实例需求 为了介绍这个功能的实现,我们需要有一个特定的功能需求。在这里选…

盘点11月Sui生态发展,了解Sui的近期成长历程!

11月是Web3的“回暖期”&#xff0c;行业持续展现增长趋势。Sui紧随行业脚步&#xff0c;开展了一系列生态活动。其中历时一个多月的Quest 3游戏活动顺利结束并公布奖励&#xff0c;在多地区成功举办Move和Sui生态黑客松&交流会&#xff0c;还有针对中文社区开发者教育的星…

网络知识学习(笔记三)(传输层的TCP)

前面已经介绍了传输层的UDP协议的报文以及一下相关的知识点&#xff0c;本次主要是传输层的TCP协议&#xff0c;包括TCP报文的详细介绍&#xff1b;可靠传输、流量控制、拥塞控制等&#xff1b;建立连接、释放连接。 一、TCP基本知识点介绍 1.1、TCP协议的几个重要的知识点 …

灵活性与可靠性:SaaS云开发与定制开发小程序的优缺点解析

随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级的应用程序&#xff0c;逐渐成为了企业开展业务和提升用户体验的重要工具。对于企业而言&#xff0c;选择通过SaaS云开发或定制开发的方式开发小程序&#xff0c;都是为了更好地实现业务目标。在这篇文章中&#…

0009Java程序设计-ssm微信小程序在慢性疾病管理中的应用

文章目录 **摘要**目录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例…

uniapp-实现一级二级职位选择,完整页面!!!

一、需求 该页面实现的功能有&#xff1a; 该页面是左侧为一级&#xff0c;右侧为二级&#xff1b;可以搜索职位进行选择&#xff1b;底部显示已选的岗位&#xff0c;点击每一项会删除&#xff1b;右侧的二级岗位&#xff0c;点击时会选中&#xff0c;再次点击会取消&#xf…

周星驰 互联网3.0 团队下个月将上线独立 App

2023年12月7日&#xff0c;新浪科技报道指出&#xff0c;周星驰旗下的互联网3.0团队透露&#xff0c;Moonbox&#xff0c;这家周星驰创立的互联网3.0初创公司&#xff0c;计划在明年1月份完成Moonbox App的上线&#xff0c;届时该应用将免费向用户提供服务。 目前&#xff0c;…

智能外呼是什么意思?智能外呼的工作原理是什么?

智能外呼是什么意思&#xff1f; 智能外呼是指利用人工智能技术实现对电话外呼的优化和自动化&#xff0c;以提高外呼效率和质量。智能外呼可以根据客户的需求和行为进行智能化的拨号、语音识别、语音合成、自动化问答等操作&#xff0c;从而实现更高效、更准确的客户沟通和营…

maven学习笔记总结

目录 一、maven简介 二、GAVP属性 三、基于 IDLE 的 Maven 工程创建 1&#xff09;java标准工程&#xff08;Javase&#xff09;的创建 2&#xff09;java企业工程&#xff08;Javaee&#xff09;的创建 a&#xff09;手动创建 b&#xff09;插件方式创建&#xff08;fil…