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.hqwc.cn/news/499213.html

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

相关文章

尝鲜18倍速大模型Groq和世界第二AI Mistral(Le Chat)

01 尝鲜 中午,一边吃饭,一边尝试一下最新的AI:Groq,它使用了重新设计的LPU,据说比英伟达的GPU快了18倍。 运行了开源的Mixtral-8x7b模型,屏幕上的文字回复几乎是瞬间的,那种速度感,让人心跳加速。 接着,我尝试了来自欧洲的新贵——Mistral AI的Le Chat。 这个三天前…

Day07:基础入门-抓包技术全局协议封包监听网卡模式APP小程序PC应用

目录 非HTTP/HTTPS协议抓包工具 WireShark 科来网络分析系统 WPE封包 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载/端口服务/Sh…

【前端素材】推荐优质在线通用果蔬商城电商网页eStore平台模板(附源码)

一、需求分析 1、系统定义 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。它将不同种类的新鲜水果、蔬菜、干果、坚果等聚集在一起&#xff0c;为消费者提供方便、快捷的购物渠道。 2、功能需求 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。…

应用多元统计分析--多元数据的直观表示(R语言)

例1.2 为了研究全国31个省、市、自治区2018年城镇居民生活消费的分布规律&#xff0c;根据调查资料做区域消费类型划分。 指标&#xff1a; 食品x1&#xff1a;人均食品支出(元/人) 衣着x2&#xff1a;人均衣着商品支出(元/人) 居住x3&#xff1a;人均居住支出(元/人) 生活x4…

如何文件批量重命名?

如何文件批量重命名&#xff1f;在日常工作和生活中&#xff0c;我们经常会面临大量文件需要整理和管理的情况。而文件批量重命名这一简单而实用的功能&#xff0c;则成为了我们高效处理文件的利器。通过文件批量重命名功能&#xff0c;我们可以快速、方便地对多个文件进行统一…

javaee教程郑阿奇课后答案,三年经验月薪50k我是怎么做到的

个人背景 如标题所示&#xff0c;我的个人背景非常简单&#xff0c;Java开发经验1年半&#xff0c;学历普通&#xff0c;2本本科毕业&#xff0c;毕业后出来就一直在Crud&#xff0c;在公司每天重复的工作对我的技术提升并没有什么帮助&#xff0c;但小镇出来的我也深知自我努…

ArmSoM Rockchip系列产品 通用教程 之 CAN 使用

CAN 使用 1. CAN 简介 CAN (controller Area Network)&#xff1a;控制器局域网络总线&#xff0c;是一种有效支持分布式控制或实时控制的串行通信网络。 目前世界上绝大多数汽车制造厂商都采用CAN总线来实现汽车内部控制系统之间的数据通信。 RK3568/RK3588的CAN驱动文件&a…

【程序员是如何看待“祖传代码”的?】《代码的遗产:探索程序员眼中的“祖传代码”》

程序员是如何看待“祖传代码”的&#xff1f; 在程序员的世界里&#xff0c;代码不仅仅是构建软件的基石&#xff0c;它们也承载着历史、智慧和技术的演变。在我的编程生涯中&#xff0c;我遇到过许多神奇而独特的“祖传代码”&#xff0c;这些代码如同古老的魔法书&#xff0…

Redis高级应用——海量数据高并发下Reids的分片集群,原理和应用,集群伸缩以及项目配置

目录 引出Reids海量数据&#xff0c;高并发问题认识Redis集群算法搭建Redis分片集群准备实例安装redis启动 创建集群测试 分片集群原理搭建分片集群散列插槽插槽原理小结 认识集群伸缩需求分析创建新的redis实例添加新节点到redis集群转移插槽自动故障转移 SpringBoot配置Redis…

HarmonyOS端云体化开发—创建端云一体化开发工程

云开发工程模板 DevEco Studio目前提供了两种云开发工程模板&#xff1a;通用云开发模板和商城模板。您可根据工程向导轻松创建端云一体化开发工程&#xff0c;并自动生成对应的代码和资源模板。在创建端云一体化开发工程前&#xff0c;请提前了解云开发工程模板的相关信息。 …

2、表结构数据

1、表结构数据 表结构数据——以字段或记录作为数据的引用、操作及计算的基本单位的数据。 表的数据结构是方形的&#xff0c;要求不同字段记录行数相同。 字段——整列数记录——整行数维度——业务角度度量——业务行为的结果维度字段——文本型度量字段——数值型 2、事实…

价格腰斩:腾讯云和阿里云服务器优惠价格对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器62元一年&#xff0c;2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…