lv19 多态 4

1 虚函数

虚函数( 基类指针可指向派生类对象, 动态联编)

先看示例,不加virtual,不认对象认指针。

#include <iostream>using namespace std;class A{
public:A(){ }~A(){ }void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:void show(){cout<<"BBBBBBBBBBBBB"<<endl;}};int main()
{/*A a;a.show();//AAAAAAAAAAAAAAX b;b.show();//BBBBBBBBBBBBB
*/AX a;//定义派生类AX *q = &a; //认函数A  *p = &a;q->show();  //BBBBBBBBBBBBBp->show();  //AAAAAAAAAAAAA}

加上virtul,通过指针找到对象,对象类型是什么调什么函数。动态链接的方式。

#include <iostream>using namespace std;class A{
public:A(){ }~A(){ }virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:void show(){cout<<"BBBBBBBBBBBBB"<<endl;}};int main()
{/*A a;a.show();//AAAAAAAAAAAAAAX b;b.show();//BBBBBBBBBBBBB
*/AX a;//定义派生类AX *q = &a; //认函数A  *p = &a;q->show();  //BBBBBBBBBBBBBp->show();  //BBBBBBBBBBBBB}

2 多态应用

设计一个函数能求多个“图形”总周长。

纯虚类用法

#include <iostream>using namespace std;class shape{
public:virtual double getC(void) = 0;    //纯虚函数的声明,表示在派生类中必须实现该函数,否则编译器不通过。
//	{                                 //虚函数可以不要求派生类必须实现//	}
};class Cir:public shape{
public:Cir(double ri):r(ri) { }double getC(void){return 2*3.14*r;	}
private:int r;
};class Tri:public shape{
public:Tri(double a, double b, double c):e1(a),e2(b),e3(c){ }double getC(void){return e1+e2+e3;	}
private:double e1;double e2;double e3;
};class Rec: public shape{
public:Rec(double e){this->e = e;}double getC(void){return 4*e;	}private:double e;
};double countC(shape *arr[], int n)
{double sum = 0;for(int i=0; i<n; i++){sum += arr[i]->getC();}return sum;
}int main()
{//shape x;  //如果是纯虚函数的声明会编译不通过Cir c(1);Rec r(3);Cir c1(2);Tri t(3,3,3);shape *arr[] = {&c, &r, &c1, &t};cout << "total C: "<<countC(arr, 4) << endl;
}

3 虚析构函数

现象

#include <iostream>using namespace std;class A{
public:A(){ }~A(){ cout<<"A~~~~~~~~~"<<endl; }//virtual ~A(){ cout<<"A~~~~~~~~~"<<endl; }  //加virtual 也一样调用3次virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:~AX(){ cout<<"AX~~~~~~~~~"<<endl; }void show(){cout<<"BBBBBBBBBBBBBB"<<endl;}};int main()
{AX a;   //派生类构造的时候调用了1次基类构造函数,所以析构的时候有2次A b;
}//析构函数调用了3次A~~~~~~~~~   //a
AX~~~~~~~~~  //a
A~~~~~~~~~   //b
#include <iostream>using namespace std;class A{
public:A(){ }	virtual ~A(){ cout<<"A~~~~~~~~~"<<endl; }  //加virtual 也一样调用3次virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:~AX(){ cout<<"AX~~~~~~~~~"<<endl; }void show(){cout<<"BBBBBBBBBBBBBB"<<endl;}};int main()
{AX a;   //派生类构造的时候调用了1次基类构造函数,所以析构的时候有2次A b;
}//析构函数调用了3次A~~~~~~~~~   //a
AX~~~~~~~~~  //a
A~~~~~~~~~   //b

#include <iostream>using namespace std;class A{
public:A(){ }virtual ~A(){ cout<<"A~~~~~~~~~"<<endl; }virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:~AX(){ cout<<"AX~~~~~~~~~"<<endl; }void show(){cout<<"BBBBBBBBBBBBB"<<endl;}};int main()
{AX *p = new AX;delete p;
}//
AX~~~~~~~~~
A~~~~~~~~~
#include <iostream>using namespace std;class A{
public:A(){ }virtual ~A(){ cout<<"A~~~~~~~~~"<<endl; }virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:~AX(){ cout<<"AX~~~~~~~~~"<<endl; }void show(){cout<<"BBBBBBBBBBBBBB"<<endl;}};int main()
{AX *p = new AX;delete p;    //
}
//
AX~~~~~~~~~
A~~~~~~~~~

不安全的情况 

#include <iostream>using namespace std;class A{
public:A(){ }~A(){ cout<<"A~~~~~~~~~"<<endl; }virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:~AX(){ cout<<"AX~~~~~~~~~"<<endl; }void show(){cout<<"BBBBBBBBBBBBBB"<<endl;}};int main()
{A *p = new AX;delete p;   //析构不完整}//
A~~~~~~~~~//virtual 用在析构函数上安全一点,防止内存泄漏
#include <iostream>using namespace std;class A{
public:A(){ }virtual ~A(){ cout<<"A~~~~~~~~~"<<endl; }virtual void show(){cout<<"AAAAAAAAAAAAA"<<endl;}};class AX:public A{
public:~AX(){ cout<<"AX~~~~~~~~~"<<endl; }void show(){cout<<"BBBBBBBBBBBBBB"<<endl;}};int main()
{A *p = new AX;delete p;   }//
AX~~~~~~~~~
A~~~~~~~~~

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

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

相关文章

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…

三款热门超声波清洗机对比测评:希亦、固特、大宇多维度实测!

如果你非常在意物品的健康卫生&#xff0c;并且希望能够摆脱手动清洗一些物品而彻底解放双手&#xff01;在家备一款超声波清洗机还是非常有必要的&#xff01;无论是珠宝、眼镜还是日常小物&#xff0c;都希望能够保持如新的光泽和卫生状态。那么超声波清洗机是最合适不过的&a…

ubuntu22.04工具整理以及安装使用方式

截图工具 火焰截图 安装&#xff1a; sudo apt install flameshot增加自定义快捷键&#xff1a; 然后就可是使用是指的快捷键进行截图了。 如果没有在截图上编辑的需要&#xff0c;其实自带的截图也够用的。

2 网络技术基础(2)

1.网络拓扑分类 基本的网络拓扑有五种&#xff1a;星形、环形、总线形、树形与网状。 1.1 星形拓扑 星形拓扑结构的主要特点是&#xff1a;①节点通过点-点通信线路与中心节点连接&#xff1b;②中心节点控制全网的通信&#xff0c;任何两节点之间的通信都要通过中心节点&…

文献阅读:Transformers are Multi-State RNNs

文献阅读&#xff1a;Transformers are Multi-State RNNs 1. 内容简介2. 方法介绍 1. 基础回顾 1. RNN2. Transformer 2. Transformer解构 1. MSRNN2. Transformer 3. TOVA 1. 现有转换策略2. TOVA 3. 实验考察 & 结论 1. 实验设计2. 实验结果 1. LM2. 长文本理解3. 文本生…

一. demo

1. 舞台-场景-控件 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.stage.Stage;import java.util.Arrays;public class Main e…

Jenkins设置root权限(13)

1.将 Jenkins 账号加入到 root 组中。 gpasswd -a jenkins root2.修改/etc/sysconfig/jenkins文件&#xff0c;添加如下配置。 JENKINS_USER"root" JENKINS_GROUP"root"3.重启 Jenkins service Jenkins restart4.验证 groups jenkins jenkins : jenkin…

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

CS0449

CS 0449 – Project 1: Mastermind and EXIF Viewer Mastermind Implementation (30 points) In this game, the computer chooses 4 pegs each with one of 6 colors. This is the color-based predecessor to Wordle. The player’s job is then to guess the colors that t…

windows IIS 申请和配置https(SSL)的工具 win-acme

win-acme 是一个为Windows平台设计的工具&#xff0c;用于从Lets Encrypt自动获取和续期SSL/TLS证书&#xff0c;特别适合用于IIS&#xff08;Internet Information Services&#xff09;服务器。它的使用相对简单&#xff0c;提供了一个用户友好的命令行界面&#xff0c;以及一…

Python + Selenium —— 键盘操作!

Keys 类对键盘按键进行了定义&#xff0c;结合 send_keys() 方法可以向页面元素发送各种键盘按键。 比如在京东首页的搜索框&#xff0c;输入查询的内容后&#xff0c;再按一次回车。这是我们大部分人操作搜索的过程。 from selenium.webdriver.common.keys import Keys # 引…

技术派数据库表自动初始化(学习)

不需要在db中手动创建或者导入相关的schema、data&#xff0c;项目启动自动创建对应的表&#xff0c;并初始化。实现该过程。 Liquibase数据库版本管理 依赖配置 在paicoding-web模块中&#xff0c;pom.xml 文件中添加 <dependency><groupId>org.liquibase</g…

01 MySQL之连接

1. 连接 1.0 基础认知 多表(主表)和一表(从表的区别): 多表一般是主表&#xff0c;一般存储主要数据&#xff0c;每个字段都可能存在重复值&#xff0c;没有主键&#xff0c;无法根据某个字段定位到准确的记录&#xff1b; 一表一般是从表&#xff0c;一般存储辅助数据&…

2024年腾讯云优惠活动——十大活动TOP10来看看

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

「板块轮动」和「经济周期」的关系

这是 溪踪投研 的第 005 篇文章 初涉股市&#xff0c;如身在山中&#xff0c;丘壑纵横&#xff0c;不知所处。这时不妨把时间拉长、范围拓宽&#xff0c;视野格局大为不同&#xff0c;就更容易找到投资方向&#xff0c;趋利而动、避害而行。 一、逃不开的「经济周期」 如同人…

阿里云4核16G服务器多少钱?幻兽帕鲁配置报价

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

迎接2024年3月5-7日国际生物发酵展-华运机械

参展企业介绍 合肥华运机械制造有限公司初创于1995年&#xff0c;系国内专业性流体机械设备制造的高新技术企业、安徽省专精特新企业&#xff0c;公司位于国家级开发区合肥双凤工业园&#xff0c;拥有15000㎡现代化厂房&#xff0c;几十台精密数控机床和焊接机器人&#xff0c…

vue3使用echarts绘制地图

vue3使用echarts绘制地图 安装echarts npm install echarts下载地图的json数据【我这里是把json数据单独粘出来然后新建了一个文件china.json】 下载中国及各个省份的地图数据引入 import chinaJson from ./china.json绘制地图 <template><div ref"myChart&q…

JVM(3)

垃圾回收(GC)相关 在C/C中,当我们使用类似于malloc的内存开辟,还需要手动释放内存空间,这样的机制在使用时给我们造成了诸多不便,但在Java中,有垃圾回收这样的机制,这就是指:我们不再需要手动释放,程序会自动判定,某个内存空间是否可以继续使用,如果内存不使用了,就会自动释放…

数据抽取平台pydatax介绍--实现和项目使用

数据抽取平台pydatax实现过程中&#xff0c;有2个关键点&#xff1a; 1、是否能在python3中调用执行datax任务&#xff0c;自己测试了一下可以&#xff0c;代码如下&#xff1a; 这个str1就是配置的shell文件 try:result os.popen(str1).read() except Exception as …