C++多态——虚函数(1)
其实在学习的时候,一直没有搞懂为什么要用虚函数,为什么需要传递基类的引用或者指针,要用谁的时候写谁不就好了。其实这时候我的思维还局限在面向过程编程,不是面向对象编程。现在搞明白了,因为多态,利用继承的思想,减少代码复用。我们来看下面的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<iostream> using namespace std; // 基类Fish class Fish{ public : // virtual void Swim(){ void Swim(){ cout << "Fish Swim." << endl; } virtual void Sleep(){ cout << "Fish Sleep." << endl; } }; // 派生类Tuna class Tuna: public Fish{ public : void Swim(){ cout << "Tuna Swim." << endl; } void Sleep(){ cout << "Tuna Sleep." << endl; } }; // 派生类Carp class Carp: public Fish{ public : void Swim(){ cout << "Carp Swim." << endl; } void Sleep(){ cout << "Carp sleep." << endl; } }; // 有一个函数,接受Fish类型的参数,调用sleep函数 // 我们直接创建想要的对象,就行调用就行 // 比如说,我们想要Tuna和Carp显示sleep void SleepFish(Fish & fish){ fish.Sleep(); } // 如果为每个派生类都建立一个函数 // 会非常的繁琐,比如说swimfish // 如果直接调用派生类对象, // 那么每次添加新的派生类时,都需要修改代码来处理新的类。 // 而使用虚函数,只需要在新的派生类中重写虚函数即可。 void SwimFish(Tuna & fish){ fish.Swim(); } int main(){ Tuna mydinner;<br> //直接调用sleepfish SleepFish(mydinner);<br> //swimfish就需要为每个派生类对象创建不同的函数 SwimFish(mydinner); // 直接调用sleepfish Carp mylunch; SleepFish(mylunch); return 0; } |
代码中所写,我们在基类中将Sleep()设置为虚函数,在派生类中重写Sleep()。 当我们实例化一个Tuna的对象mydinner时,在函数SleepFish传入对象mydinner,在函数中调用Sleep,会显示“Tuna sleep.”。同理,实例化一个Carp对象mylunch,会显示“Carp sleep.”。在Swim()中,假如我们想在函数SleepFish中调用不同对象的Swim,就需要创建不同的SwimFish,比较繁琐。也是正因为如此,多态的思想体现了出来,允许不同类的对象对同一消息做出响应的能力,即同一个函数调用可以有不同的行为。
多态主要有两种形式:
1.编译时多态(早期绑定):这种多态通过函数重载(Overloading)和方法重写(Overriding)实现。函数重载发生在同一个类中,当有多个同名函数但参数列表不同时。方法重写发生在继承关系中,子类重写父类的方法,但保持相同的方法签名(方法名、参数列表和返回类型)。
2.运行时多态(晚期绑定):这种多态主要通过虚函数(Virtual Functions)实现。当一个基类的指针或引用指向派生类的对象,并调用一个虚函数时,将根据对象的实际类型来确定调用哪个函数。这通常涉及到动态绑定(Dynamic Binding),即在程序运行时确定方法的调用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix