7.C++:多态

一、 virtual关键字

//1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一;

//2.可以在菱形继承中,完成虚继承,解决数据冗余和二义性;

两个地方使用同一关键字,但二者间没有一点关联

二、多态的构成条件

继承中要构成多态还有两个条件
1. 必须通过基类的指针或者引用调用虚函数
2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
重写:派生类中有一个跟基类完全相同的虚函数(返回值类型,函数名字,参数列表完全相同)

//1.满足多态的条件:跟对象有关,指向哪个对象就调用它的虚函数

//2.不满足多态条件:跟类型有关,调用的类型是谁,就去调用它的。 

class Person 
{
public:virtual void BuyTicket() { cout << "买票-全价" << endl; }
};
class Student : public Person
{
public:virtual void BuyTicket() { cout << "买票-半价" << endl; }
};
void Func(Person& p)   //只能用父类,与切片有关
{p.BuyTicket();
}
int main()
{Person ps;Student st;Func(ps);   //调用的父类的Func(st);   //调用的子类的return 0;
}
//或者
void Func(Person* p) 
{p->BuyTicket();
}
int main()
{Person ps;Student st;Func(&ps);   //调用的父类的Func(&st);   //调用的子类的return 0;
}

三、虚函数重写的两个例外

3.1 协变(基类与派生类虚函数返回值类型不同)

//1.基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用

//2.父类函数返回的类型可以是其他的父类指针,子类同理

class A {};
class B : public A {};class Person 
{
public:virtual A* f() { return new A; } 
};
class Student : public Person 
{
public:virtual B* f() { return new B; } //返回类型不同,仍构成重写
};

3.2析构函数的重写(基类与派生类析构函数的名字不同)

如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。
class Person 
{
public:virtual ~Person() { cout << "~Person()" << endl; }
};class Student : public Person 
{
public:virtual ~Student() { cout << "~Student()" << endl; }
};
// 只有派生类Student的析构函数重写了Person的析构函数,下面的delete对象调用析构函数,才能构成
//多态,才能保证p1和p2指向的对象正确的调用析构函数。
int main()
{Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0;
}

输出:

~Person()
~Student()
~Person()  //调用子类析构后,会自动调用父类的析构


class Person {
public:~Person() { cout << "~Person()" << endl; }
};class Student : public Person {
public:~Student() { cout << "~Student()" << endl; }
};
//不构成多态
int main()
{Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0;
}

输出:

~Person()
~Person() 


 四、override和final

4.1 final:修饰虚函数,表示该虚函数不能再被重写

class Car
{
public:virtual void Drive() final {}  //此类不能被重写
};
class Benz :public Car
{
public:virtual void Drive() { cout << "Benz-舒适" << endl; }
};
class Car final
{
public:virtual void Drive()  {}  
};
class Benz :public Car //不能继承被final修饰的父类
{
public:virtual void Drive() { cout << "Benz-舒适" << endl; }
};

4.2 override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。

class Car
{
public:virtual void Drive(){}
};
class Benz :public Car 
{
public:  //检查是否重写virtual void Drive() override {cout << "Benz-舒适" << endl;}
};

五、重载、覆盖(重写)、隐藏(重定义)的对比


六、 抽象类

6.1 概念

//1.在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象
//2.派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象
class Car
{
public:virtual void Drive() = 0;
};
class Benz :public Car
{
public:
};
int main()
{//Car cc; 不可实例化对象//Benz bb; 仍是一个抽象类return 0;
}
class Car
{
public:virtual void Drive() = 0; //强制子类重写
};
class Benz :public Car
{
public:virtual void Drive()  //重写纯虚函数{cout << "Benz-舒适" << endl;}
};
int main()
{Benz bb; //可以创建return 0;
}

6.2 接口继承和实现继承

//1.普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。

//2.虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。

//所以如果不实现多态,不要把函数定义成虚函数。


七、动态绑定与静态绑定

1. 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为也称为静态多 ,比如:函数重载
2. 动态绑定又称后期绑定(晚绑定),是在程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态
int i = 0;
double d = 1.1;
//静态绑定,静态的多态(静态:编译时)
f1(i);
f1(d);
//动态绑定,动态的多态(动态:运行时)
Base* p = new Base;
p->Func1();
p = new Derive;
p->Func1();

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

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

相关文章

淘宝扭蛋机小程序开发:开启购物娱乐新纪元

在数字时代浪潮的推动下&#xff0c;小程序作为新兴的交互平台&#xff0c;正在不断引领着购物方式的革新。淘宝扭蛋机小程序的开发&#xff0c;便是这一变革中的一颗璀璨明星&#xff0c;它将传统扭蛋机的趣味与电商购物的便捷完美融合&#xff0c;为用户带来了前所未有的购物…

Python+人工智能

Python人工智能 一、Python基础语法 涵盖Python基础知识&#xff0c;让大家掌握基础的编程能力 Python注释 单行注释&#xff1a;#注释内容多行注释&#xff1a;‘’‘注释内容’‘’ 变量和数据类型 变量 变量就是用来存储数据的。赋值变量时不需要指定数据类型&#xff0c;…

【R: mlr3:超参数调优】

本次分享官网教程地址 https://mlr3book.mlr-org.com/chapters/chapter4/hyperparameter_optimization.html 型调优 当你对你的模型表现不满意时&#xff0c;你可能希望调高你的模型表现&#xff0c;可通过超参数调整或者尝试一个更加适合你的模型&#xff0c;本篇将介绍这些操…

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息&#xff1a; 发表于&#xff1a;IEEE TRANSACTIONS ON MULTIME…

【Redis 神秘大陆】006 灾备方案

六、Redis 灾备方案 6.1 存储方案 6.1.1 基础对比 RDB持久化AOF持久化原理周期性fork子进程生成持久化文件每次写入记录命令日志文件类型二进制dump快照文件文本appendonly日志文件触发条件默认超过300s间隔且有1s内超过1kb数据变更永久性每秒fsync一次文件位置配置文件中指…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

计算机网络 TCP/IP体系 物理层

一. TCP/IP体系 物理层 1.1 物理层的基本概念 物理层作为TCP/IP网络模型的最低层&#xff0c;负责直接与传输介质交互&#xff0c;实现比特流的传输。 要完成物理层的主要任务&#xff0c;需要确定以下特性&#xff1a; 机械特性&#xff1a;物理层的机械特性主要涉及网络…

华为春招内幕:2024年最全Spring Dependency Injection面试题大全,深入掌握DI技术!99%的应聘者都推荐收藏!

在2024年&#xff0c;随着软件开发领域对高效和灵活的编程实践的需求日益增长&#xff0c;依赖注入&#xff08;DI&#xff09;作为一种关键的设计模式&#xff0c;在现代软件开发中扮演着至关重要的角色。华为&#xff0c;作为全球领先的技术创新公司&#xff0c;对其软件工程…

【Altium Designer 20 笔记】PCB层

Top Overlay & Bottom Overlay (顶部丝印层和底部丝印层)&#xff1a; 用于标记元件、连接和其他重要信息。丝印层是 PCB 表面的一层&#xff0c;上面印上文字、图标或标记。 Top Solder & Bottom Solder (顶部阻焊层和底部阻焊层)&#xff1a; 阻焊层、开窗层、绿油层…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

K8S认证工程师(CKA)考试速通经验分享(含答案)

昨天参加了Linux Foundation推出的Certified Kubernetes Administrator(CKA)考试&#xff0c;今天收到邮件通知通过啦&#xff5e;分数是93/100分 证书这个样子 ➡️随着应用现代化成为IT/互联网行业大趋势&#xff0c;企业的系统架构逐渐向微服务、容器化转型&#xff0c;好处…

并行计算基础以及相关C语言API介绍

并行计算概念 并行计算是一种利用多个计算资源&#xff08;如多个处理器、计算单元或计算机集群&#xff09;同时执行多个计算任务的方法&#xff0c;旨在提高计算机系统的处理能力和效率。它通过将原始计算任务分解为多个子任务&#xff0c;让多个处理单元同时执行这些子任务…

spring03:bean的自动装配

spring03&#xff1a;bean的自动装配 文章目录 spring03&#xff1a;bean的自动装配前言&#xff1a;一、 在xml中显示的配置&#xff1a;分析&#xff1a; People类&#xff1a;Cat类&#xff1a;Dog类&#xff1a;1. 在xml中显示的配置&#xff1a; 二、 隐式的自动装配bean【…

量子密钥分发系统设计与实现(一):系统基本架构讨论

经过一段时间讨论&#xff0c;我们了解到量子密钥分发设备是当前量子保密通信系统的基础。从本文开始&#xff0c;我将开启量子密钥分发系统设计与实现系列&#xff0c;详细讨论量子密钥分发设备如何从0到1的搭建。 1.QKD系统总体讨论 QKD系统的核心功能就是为通信双方提供理论…

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后&#xff0c;我每天都有记录自己的学习时长。今天晚上&#xff0c;我在复盘我自己学习时长的时候&#xff0c;我发现&#xff0c;在整个四月份&#xff0c;我平均每天的有效学习时长只有6h&#xff0c;而且到今天为止&#xff0c;整个四…

写作对于技术人来说是最好的投资

上周日参加了腾讯云开发者社区和墨问西东组织的技术创作特训营活动&#xff0c;今天复盘一下。 虽说是技术创作特训营&#xff0c;现场到场的超过半数也都是技术人&#xff0c;但是分享的内容并不局限于技术人。 这次分享包括四个部分的内容&#xff0c;四个部分内容是一个体…

Excel使用 CONCATENATE 函数或“”符号拼接多列数据

如果你想在Excel中拼接多列数据&#xff0c;你可以使用Excel的函数来实现。其中一个常用的函数是CONCATENATE函数或者更简洁的&符号。以下是如何使用这些方法拼接多列数据的示例&#xff1a; 假设有以下的数据&#xff1a; ABCJohnDoe25JaneSmith30BobBrown35 1. **使用…

mvn spring-boot:run运行报错

[ERROR] No plugin found for prefix ‘spring-boot’ in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/Users/itkey/.m2/repository), public (https://maven.aliyun.com/reposito…

Python基于循环神经网络的情感分类系统设计与实现,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…