多态性

简介: 多态性

1.多态性

多态性只是针对虚函数说的,非虚函数,不存在多态的说法

2.虚函数

纯虚函数是在父类中声明的虚函数,它在父类中没有函数体,只有声明,要求任何子类都要定义该虚函数自己的实现方法

含有纯虚函数的类不允许创建对象,比如Human human;是错误的,这种类叫做抽象类,他们不能用来生成对象,主要目的是为了统一管理子类(或者说建立一套供子类参照的标准或规范)

抽象类中的虚函数不写函数体,而是推迟到子类中去写

抽象类主要是用来做父类,把一些公共接口写成纯虚函数,这些纯虚函数相当于一些规范,所有继承的子类都要实现这些规范(重写这些纯虚函数)


其实压根不需要抽象类(父类),直接子类实现自己的eat接口不就好了,但是如果这样的话,怎么实现多态呢?多态的实现是:父类指针指向子类对象,如果没有父类,也就不存在多态

3.父类析构函数为虚函数

用父类指针new一个子类对象,在delete的时候系统不会调用子类的析构函数,这肯定是有问题的

Human * phuman =

解决方法就是,把父类Human的析构函数声明为虚函数即可

4.不能将“this”指针从“const XXX”转为“XXX &”

如果报不能将不能将“this”指针从“const XXX”转为“XXX &”, 出现上述错误的原因是在const成员函数中调用了非const成员函数,因此只要将所调用的函数都改成const函数

5.父类和子类的函数

先执行父类构造函数,再执行子类构造函数

父类中的private成员不受继承方式的影响,子类永远无法访问

对于父类来说,尤其是父类的成员函数,如果不想让外面访问,就设置为private,如果想让自己的子类能够访问,就设置为protected,入股偶像公开,就设置为public

6.函数遮蔽

函数遮蔽:正常情况下,父类的成员函数只要是用public或者protected修饰的,子类只要不采用private继承方式来继承父类,那么子类中都可以调用,但是在类继承中,只要子类的函数和父类的函数有同名,那无论参数和类型,子类的这个函数都会遮蔽掉父类的同名函数,完全无法调用父类的同名函数了

当然也有方法可以调用父类的,只不过类是这样: 父类::成员函数名(—)的方式来调用

也可以让using的方式,比如在子类的.h种这样写 using 父类::函数,换句话说就是让父类的同名函数在子类中以重载的方式使用,这个点还比较复杂,可以看那306页

7.父类指针

父类指针new一个子类对象 是可以的,但反过来不行

比如Human * phuman2 = new Men;这是可以的

父类指针很强大, 不仅可以指向父类对象,也可以指向子类对象

但是父类指针没办法调用子类的成员函数

8.override

C++11中,可以在函数声明所在行的末尾增加一个override关键字,这个关键字是用在子类中,而且是虚函数专用的

virtual void eat() override;

如果不用父类类型指针,而是用普通对象来调用虚函数,那虚函数的作用就体现不出来了,因为这就不需要运行时(根据new的是哪个类的对象)决定绑定哪个函数,而是在编译时候就能确定的

相关文章
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
TrajectoryCrafter:腾讯黑科技!单目视频运镜自由重构,4D生成效果媲美实拍
TrajectoryCrafter 是腾讯与香港中文大学联合推出的单目视频相机轨迹重定向技术,支持后期自由调整视频的相机位置和角度,生成高质量的新型轨迹视频,广泛应用于沉浸式娱乐、创意视频制作等领域。
275 12
|
机器学习/深度学习 人工智能 算法
Stable Diffusion AI绘画
Stable Diffusion是人工智能领域的文本到图像生成模型,基于概率的连续扩散过程,学习数据潜在分布并生成新样本。模型使用Web UI进行交互,提供不同采样器如Euler和DPM++,后者常配以Karras算法。提示词对生成效果至关重要,可以利用GPT等生成提示词。用户还能调整参数如高清修复和批处理次数来影响生成的图像。此外,模型文件(ckpt/safetensors)和Lora微调模型需存放在正确目录以确保功能正常。
|
对象存储 数据库
2025年 | 12月云大使推广奖励规则
云大使推广返利活动,企业新用户下单返佣加码5%,推广最高返佣45%,新老用户都可参与返利活动。
101951 52
|
存储 SQL JSON
全栈自动化第三期—基于Requests实现接口自动化教程
API接口测试介于单元测试和界面测试之间,是一种灰盒测试方法,主要测试内部接口功能的完成性。相较于UI自动化测试,它具有自动化成本低和测试效率高的特点。
375 0
全栈自动化第三期—基于Requests实现接口自动化教程
|
安全 PHP 数据安全/隐私保护
PHP审计-实战变量覆盖漏洞
PHP审计-实战变量覆盖漏洞
|
编解码 测试技术 数据库连接
|
C语言
C语言给数字加逗号
C语言给数字加逗号
395 0
|
监控 网络协议 关系型数据库
MySQL集群搭建(二)
MySQL集群搭建
220 0
|
NoSQL 流计算
《李劲松|Flink Table Store 典型应用场景》电子版地址
李劲松|Flink Table Store 典型应用场景
188 0
《李劲松|Flink Table Store 典型应用场景》电子版地址
|
JavaScript 前端开发 网络协议