波奇学C++:多态

组合和继承

继承是白箱复用(whiter-box-reuse),获得继承类的内部细节

组合是黑盒测试(black-box-reuse),无法得走类的内部实现

class C
{//
};
//组合
class E
{
private:C _cc;
};

is-a 关系用继承,人-学生;has-a 关系用组合 车-轮胎。

多态:不同的对象,做同一个行为结果是不一样的。

比如对象student , elder people,行为buyticket(),结果是不一样的。

class Person {
public:virtual void BuyTicket()const {cout << "买票-全价" << endl;}
};
class Student :public Person {virtual void BuyTicket() { cout << "买票-半价" << endl; }
};
void func(const Person& p)
{p.BuyTicket();
}
void func(const Person* p)
{p->BuyTicket();
}
int main()
{func(Person());func(Student());Student p;func(&p);return 0;
}

构成多态的两个条件:

1.虚函数被调用的函数必须是虚函数,且派生类对基类的虚函数进行重写。BuyTicket是虚函数,并且在派生类中重写。

2.必须是指针或者引用。如果不是,则只会调用基类的基类的虚函数。(只有指针或者引用,才有能实现切片操作?)

虚函数的重写:

1.函数名,返回值,参数值三同。

2.返回值不同,但必须是父子关系指针和引用。

3.父类要加virtual,派生类重写可以不加virtual。

返回值不同 ,父子关系指针

class Person {
public:virtual Person* BuyTicket()const {cout << "买票-全价" << endl;return 0;}
};
class Student :public Person {virtual Student* BuyTicket()const { cout << "买票-半价" << endl; return 0;
}
};

指针不一定是Person*和Student*这对父子指针,其他父子指针也可以。

析构函数加virtual是重写,因为父子类虚构函数都被重名为destructor,满足析构函数条件。

析构调用的运用场景

代码

class Person {
public:~Person(){}
};
class Student :public Person {~Student(){delete _a;}int* _a = new int[10];
};
int main()
{Person* p = new Person;delete p;p = new Student;delete p;
}

多态调用看的是指向的对象,普通对象看当前调用者类型。 p的类型是父类,如果是普通类型就会调用父类的析构函数,那么就会造成内存泄漏。

我的理解是使用虚函数可以选择性向上转换。不想向上转换,就可以用重写虚函数。

final 虚函数不能被重写

 Drive函数不能被重写。

class Car
{
public:virtual void Drive() finial{}
};

override帮助派生检查是否完成重写,如果没有被重写就会报错

Drive() 必须在派生类被重写。

class Car
{
public:virtual void Drive() override{}
};

设计一个不想被继承的类

方法:基类构造函数私有,派生类构造函数必须调用构造基类构造函数

class A
{
public:static A CreateObj(){return A();}
private:A();
};

A 不能被继承,但可以通过A:: CreateObj() 来创建A对象。

方法2:用final限定继承

class A final
{
public:
private:
};

重载,重写,重定义区别:

重载:函数在同一个作用域,函数名相同,参数不同。

重写(覆盖):两个函数分别在基类和派生类的作用域,函数名,参数,返回值都必须相同,两个函数都是虚函数,即多态。

重定义:两个函数分别在基类和派生类的作用域,函数名相同,不构成重写就是重定义。

多态的底层原理

如图 A 的大小是16,原因就在于a里面保存了一个指针, 这个指针指向一个虚基表,虚基表保存虚函数的地址。内存对齐下1+8->8+8=16。

创建一个类B继承类A,b类同样存在一个_vfptr vfptr:保存的是含有重写的虚函数地址的虚基表地址。

多态的本质就是在类划分出一块空间,保存一个虚基表地址,虚基表保存一个重写虚函数的地址,

当子类调用时,访问父类空间的对应的虚基表地址,找到对应虚函数的地址。多态就是改变这个虚函数的地址。

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

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

相关文章

04-MySQL02

1、什么是索引下推&#xff1f; 索引下推&#xff08;index condition pushdown &#xff09;简称ICP&#xff0c;在Mysql5.6的版本上推出&#xff0c;用于优化查询。 需求: 查询users表中 "名字第一个字是张&#xff0c;年龄为10岁的所有记录"。 SELECT * FROM u…

【AWS】实操-保护 Amazon S3 VPC 终端节点通信

文章目录 实验概览目标实验环境任务 1&#xff1a;探索并启动实验环境任务 1.1&#xff1a;探索 Amazon VPC 资源任务 1.2&#xff1a;探索 Amazon EC2 资源任务 1.3&#xff1a;创建 Amazon VPC 终端节点任务 1.4&#xff1a;连接私有 EC2 实例任务 1.5&#xff1a;探索 Amazo…

【最新!七麦下载量analysis参数】逆向分析与Python实现加密算法

文章目录 1. 写在前面2. 请求分析3. 加密分析4. 算法实现 1. 写在前面 之前出过一个关于榜单analysis的分析&#xff0c;有兴趣的可以查看这篇文章&#xff1a;七麦榜单analysis加密分析 最近运营团队那边有同事找到我们&#xff0c;说工作中偶尔需要统计分析一下某APP在一些主…

帆软报表执行sql报SQL command not properly ended

如果你在执行预览SQL时报如下图的错误&#xff1a; 你需要检查一下几点&#xff1a; 1.是否在SQL在有逗号忘记加了 2.是否有括号少了 3.是否在SQL的最后有分号存在&#xff0c;如果有需要去掉&#xff0c;这点是比较坑的&#xff0c;因为SQL最后加分号在oracle数据库中是能够…

普通用户使用spark的client无法更新Ranger策略

普通用户使用spark的client无法更新Ranger策略 报错图片&#xff1a; WARN org.apache.ranger.admin.client.RangerAdminRESTClient: Error getting Roles. secureModetrue, usercaojianxiangUCDIPA.VIATRIS.CC (auth:KERBEROS)&#xff0c;responsef"httpStatusCode&quo…

【项目经验】:elementui表格中表头的多选框换成文字

一.项目需求 表格可以多选&#xff0c;表头都是汉字。。。。类似于这种 二.实现功能 用到的方法 Table Attributes 参数说明类型可选值默认值header-cell-class-name表头单元格的 className 的回调方法&#xff0c;也可以使用字符串为所有表头单元格设置一个固定的 className。…

Vue + Element UI 前端篇(十一):第三方图标库

Vue Element UI 实现权限管理系统 前端篇&#xff08;十一&#xff09;&#xff1a;第三方图标库 使用第三方图标库 用过Elment的同鞋都知道&#xff0c;Element UI提供的字体图符少之又少&#xff0c;实在是不够用啊&#xff0c;幸好现在有不少丰富的第三方图标库可用&…

table 单元格中嵌套子表格 样式撑开问题

如图&#xff0c;表格中的td嵌套表格&#xff0c;里边表格把外层撑开&#xff0c;不能按100%显示&#xff1b; 解决办法 给父级table 加一个table-layout:fixed;样式

SSRF漏洞实战

文章目录 SSRF概述SSRF原理SSRF 危害PHP复现SSRF漏洞检测端口扫描内网Web应用指纹识别攻击内网应用读取本地文件 Weblogic SSRF--Getshell复现SSRF攻击Redis原理漏洞检测端口扫描复现翻车&#xff0c;请看官方复现教程注入HTTP头&#xff0c;利用Redis反弹shell SSRF防御过滤输…

现代C++中的从头开始深度学习:【6/8】成本函数

现代C中的从头开始深度学习&#xff1a;成本函数 一、说明 在机器学习中&#xff0c;我们通常将问题建模为函数。因此&#xff0c;我们的大部分工作都包括寻找使用已知模型近似函数的方法。在这种情况下&#xff0c;成本函数起着核心作用。 这个故事是我们之前关于卷积的讨论的…

OC和Swift混编,导入头文件‘xxx-Swift.h‘ file not found

在OC的项目里加入Swift代码&#xff0c;创建完桥接文件后&#xff0c;需要倒入Swift头文件&#xff0c;头文件的格式为“项目名-Swift.h”。 如下图&#xff0c;我在Xcode上看到我的项目名为YichangPark&#xff0c;导入 #import "YiChangPark-Swift.h" 之后提示 “Y…

喜报 | 再度中标南网项目!AR 开启电力远程运维新智慧

近日&#xff0c;中国南方电网官网发布《2023年南方电网数字平台科技 (广东)有限公司物资品控远程协助软件采购项目中标公告》&#xff0c;ALVA Systems 凭借 ALVA Rainbow 创新应用竞得此标。 随着相关技术的逐步成熟&#xff0c;基础问题远程化解决已经在工业领域广泛应用。 …

NLP(1)--NLP基础与自注意力机制

目录 一、词向量 1、概述 2、向量表示 二、词向量离散表示 1、one-hot 2、Bag of words 3、TF-IDF表示 4、Bi-gram和N-gram 三、词向量分布式表示 1、Skip-Gram表示 2、CBOW表示 四、RNN 五、Seq2Seq 六、自注意力机制 1、注意力机制和自注意力机制 2、单个输出…

同旺科技USB to I2C 适配器烧写 Arduino 模块

所需设备&#xff1a; 内附链接 1、同旺科技USB to I2C 适配器 2、Arduino 模块 硬件连接&#xff1a; 用同旺科技USB to I2C 适配器连接芯片的TX、RX、GND; 打开Arduino IDE编辑工具&#xff0c; 点击“上传”按钮&#xff0c;完成程序的编译和烧录&#xff1b;

基于微信小程序的自习室系统设计与实现,可作为毕业设计

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

【数据结构】树的基础入门

文章目录 什么是树树的常见术语树的表示树的应用 什么是树 相信大家刚学数据结构的时候最先接触的就是顺序表,栈,队列等线性结构. 而树则是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合 非线性 体现在它是由n个有限结点(可以是零个结点)组成一个具有层次关…

HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(二)并行识别

并行识别组合手势对应的GestureMode为Parallel。并行识别组合手势中注册的手势将同时进行识别&#xff0c;直到所有手势识别结束。并行识别手势组合中的手势进行识别时互不影响。 以在一个Column组件上绑定点击手势和双击手势组成的并行识别手势为例&#xff0c;由于单击手势和…

Apinto 网关 V0.14 版本发布,6 大插件更新!

大家好&#xff01; 距离上次更新已经过去一段时间了&#xff0c;这段日子里我们一直在酝酿新的功能&#xff0c;本次的迭代将给大家带来 6 大插件的更新~一起来看看有哪些变化吧&#xff01; 新特性 1. 新增 额外参数v2 插件&#xff0c;支持对转发参数进行加密、拼接等操作…

【软件测试】单元测试、集成测试、系统测试有什么区别?

单元测试、集成测试、系统测试有什么区别 1、粒度不同 集成测试bai粒度居中&#xff0c;单元测试粒度最小&#xff0c;系统du测试粒度最大。 2、测试方式不同 集成测试一般由开发zhi小组采用白盒加黑盒的方式来测试&#xff0c;单元测试一般由开发小组采用白盒方式来测试&a…

基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的玛丽冒险小游戏程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xf…