学习C++、QT---15(C++的多态、纯虚函数)

每日一言

        你付出的每一份努力,都会在未来某一天回馈你。

C++的多态

多态什么意思呢?就是我这边花了一张图,我们是不是日常生活中需要的电视、空调、风扇,本来的话每个都需要分别一个遥控器的,我们使用多态的话就是一个万能遥控器,可以操控三个设备,只要设置相关的条件,我们的万能遥控器就可以操作全部设备了,那么怎么实现呢??

看我们的案例我创建了一个remoteControl代表万能遥控器,然后其他三个分别为电视、风扇、空调的遥控器,那么我们还是不懂怎么用啊?我们需要借助到虚函数,这个很重要,以为我们的万能遥控器在没有连接上任何一个设备的时候肯定要设置为虚函数,随后我们的派生类也就是  电视......d等等,然后我们要去重写我们这个基类的函数,前提是要先继承,重写后我们看到main函数这边,我们要用基类的指针去操作子类对象这个很重要

也就是这句话 remoteControl * p1=new tvRemoteControl(); p1是基类的指针,子类的对象是在tvRemoteControl这个类里面在堆空间创建的对象,记住我们这个对象的内存结构中包含了父类的子对象,那么子对象的首地址就是给P1这个指针变量的,所以为什么p1此时去调用open会是tv的open呢?

一句话基类指针操作子类对象就是我们多态

  • Car* Audi = new Car();面向过程具体类型编程,强调直接操作特定类型的对象,适用于逻辑简单、类型固定的场景。
  • Animal* a1 = new Dog();面向对象的抽象编程,核心是 “接口与实现分离”,允许通过统一的基类接口处理不同子类对象,符合开闭原则(新增子类无需修改原有代码)。

虚函数是会被继承的。即使子类没有显式声明 virtual 关键字,只要基类中某个函数被声明为 virtual,子类中重写的同名函数也会自动成为虚函数。

一、VTable 的本质:函数地址表

每个包含虚函数的类都有一个静态的 VTable,它存储了该类所有虚函数的实际地址。当子类重写虚函数时,子类的 VTable 会替换相应的函数地址为子类实现的地址。

关键点

  • VTable 属于类,而非对象(所有同类对象共享同一个 VTable)
  • 子类 VTable 继承基类结构,并重写被覆盖的虚函数的首地址是虚函数的首地址,也就是vptr

是的,对于包含虚函数的类的对象来说,其内存布局的首地址存储的是虚表指针(vptr),而 vptr 指向虚函数表(VTable)的首地址

抽象类

我来介绍一下抽象类,为什么会引出这个也是因为上面我们讲多态的时候,以为我们会发现,我们在基类写的虚函数,里面的内容我们根本用不上,也就是我们本来就是要用的话就是用派生类重写过的函数,所以显得很多余,那么此时我们有个抽象类的概念,

那么怎么使用呢,我们这边要引入一个纯虚函数的概念

就是我们之前写虚函数的时候我们是这样写的

 virtual void gotoClass(){

//实现体;

}

这个叫做虚函数,那么纯虚函数是这样写的

 virtual void gotoClass() = 0;

直接让他=0,这个就叫做纯虚函数,那么我们就说这个类属于抽象类,那么有什么特性呢????

现在的基类不像之前的基类还可以通过创建基类的实例化对象对 虚函数进行调用输出一些废话了, 现在的基类也叫做抽象类了,不能自己创建对象了,看下方这个

所以就不能自己去调用自己的虚函数输出废话了,因为现在是抽象类纯虚函数,没有废话,也不能创建基类对象

好的,现在我们多写几个纯虚函数

我们会发现如果我们写了两个纯虚函数,如果派生类只重写一个的话那么是不让编译通过的,必须要把全部都重写

我们普通对象调用后,发现很好用

那我们看一下可不可以支持多态

可以的哈,支持多态的,我再说一句,基类指针操作子类对象 这个就叫做多态

这个就是完整的抽象类的使用方法和特性了

补充一点:在Java中有直接的abstract这个关键字直接去表明这个类是抽象类,但是C++中没有,C++中要用类中包含纯虚函数来体现这个类是抽象类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的涛涛同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值