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.rhkb.cn/news/266184.html

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

相关文章

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟&#xff1a;RCC_APB2Perip…

OpenAI Triton 入门教程

文章目录 Triton 简介背景Triton 与 CUDA 的关系 Triton 开发样例样例一&#xff1a;Triton vector addition 算子Triton kernel 实现kernel 函数封装函数调用性能测试 样例二&#xff1a;融合 Softmax 算子动机Triton kernel 实现kernel 封装单元测试性能测试 样例三&#xff…

【知识整理】Git Commit Message 规范

一. 概述 前面咱们整理过 Code Review 一文&#xff0c;提到了 Review 的重要性&#xff0c;已经同过gitlab进行CodeReview 的方式&#xff0c;那么本文详细说明一下对CodeReivew非常重要的Git Commit Message 规范。 我们在每次提交代码时&#xff0c;都需要编写 Commit Mes…

会声会影2024出来了吗?

近年来&#xff0c;随着人们对于娱乐和创意的需求不断增长&#xff0c;视频编辑软件也越来越受到大众的关注。其中&#xff0c;会声会影是一款备受欢迎的视频编辑软件&#xff0c;许多用户都在关注其新版本——会声会影2024。 然而&#xff0c;目前并没有官方宣布会声会影2024的…

如何制作一款建材商城微信小程序

现在&#xff0c;微信小程序已经成为了很多企业和商家开展线上业务的重要渠道之一。对于建材商城而言&#xff0c;制作一款专属的微信小程序可以帮助企业更好地展示产品、提供服务&#xff0c;并增加销售额。下面将介绍如何制作一款建材商城微信小程序。 首先&#xff0c;登录【…

C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题&#xff08;Gold Mine Problem&#xff09; 给定一个N*M尺寸的金矿&#xff0c;每个点都有一个非负数表示当前点所含的黄金数目&#xff0c;最开始矿工位于第一列&#xff0c;但是可以位于任意行。矿工只能向右&#xff0c;右上&#xff0c;右下三个方向移动。问该…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机&#xff08; EVM &#xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能&#xff1a;区块链项⽬⼤部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以 规避很多亏钱项⽬。…

javaweb学习(day04-XML)

一、介绍 1 官方文档 地址: https://www.w3school.com.cn/xml/index.asp 2 为什么需要 XML 需求 1 : 两个程序间进行数据通信需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名…

php基础学习之错误处理(其一)

一&#xff0c;错误处理的概念 错误处理指的是系统(或者用户)在执行某些代码的时候&#xff0c;发现有错误&#xff0c;就会通过错误处理的形式告知程序员&#xff0c;俗称报错 二&#xff0c;错误分类 语法错误&#xff1a;书写的代码不符合 PHP 的语法规范&#xff0c;语法错…

Qt Android sdk配置报错解决

使用的jdk8总是失败&#xff0c;报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17&#xff0c;就配置生效了。Android sdk路径可以选用Android Studio自带的&#xff0c;但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后&#xff0c;点击‘测试连接’&#xff0c;若提示成功&#xff0c;则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数&#xff1a; mail.catchall.alias: 收件服…

300分钟吃透分布式缓存(拉钩教育总结)

开篇寄语 开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 你好&#xff0c;我是你的缓存老师陈波&#xff0c;可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚&#xff0c;经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…

代码随想录算法训练营 Day29 | LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II

LeetCode491.递增子序列 该题强调与之前的题目的不同在于给的数组顺序不能变换&#xff0c;这就导致了不能用used数组判断与前一个元素是否相同的方法进行去重的操作&#xff0c;因此该题加入了一个set&#xff0c;不和前一个元素比&#xff0c;而是判断之前有没有处理过这个值…

网工内推 | 项目经理,软考证书优先,最高26K,加班补贴

01 龙盈智达 招聘岗位&#xff1a;项目经理 职责描述&#xff1a; 1 根据业务员需求&#xff0c;完成生态圈下账簿中心系统的开发管理工作。 2 负责账簿中心实施过程中的需求调研分析、方案设计、开发测试、系统上线等工作的计划、组织协调、沟通等方面管理工作。 3 完成系统核…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

RabbitMQ的常见工作模式

Work queues 工作队列模式 模式说明 通过Helloworld工程我们已经能够构建一个简单的消息队列的基本项目&#xff0c;项目中存在几个角色:生产 者、消费者、队列&#xff0c;而对于我们真实的开发中 &#xff0c;对于消息的消费者通过是有多个的。 比如在实现用户注册功能时&…

社区团购小程序有哪些功能 怎么制作开通

​随着社区团购的兴起&#xff0c;越来越多的人开始关注社区团购小程序的制作。社区团购小程序是一种基于移动互联网的新型购物方式&#xff0c;通过小程序&#xff0c;用户可以在社区内方便地参与团购活动&#xff0c;享受到更优惠的价格和更方便的购物体验。下面具体介绍社区…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 &#x1f981; 一. 前言&#x1f981; 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 &#x1f981; 一. 前言 各位好&#xff01;我是&#x1…

【分布式事务 XA模式】MySQL XA模式详解

MYSQL中的XA事务 写在前面1. XA事务的基本原理2. MySQL XA事务操作 写在前面 MySQL 的 5.0.3 版本开始支持XA分布式事务&#xff0c;并且只有innoDB存储引擎支持XA事务。 1. XA事务的基本原理 XA事务本质上是一种基于两阶段提交的分布式事务&#xff0c;分布式事务可以理解成…

R语言数学建模(二)—— tidymodels

R语言数学建模&#xff08;二&#xff09;—— tidymodels 文章目录 R语言数学建模&#xff08;二&#xff09;—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …