前言
本篇博客我们来介绍多态知识的总结,这一部分面试官特别爱提问,也是我们需要注意的
💓 个人主页:小张同学zkf
⏩ 文章专栏:C++
若有问题 评论区见📝
🎉欢迎大家点赞👍收藏⭐文章
目录
1.多态的概念
多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为
编译时多态(静态多态)
和
运⾏时多态(动态多态)
,编译时多态(静态多态)主要就是我们前⾯总结的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。
运⾏时多态,具体点就是去完成某个⾏为(函数),可以传不同的对象就会完成不同的⾏为,就达到多种形态。⽐如买票这个⾏为,当普通⼈买票时,是全价买票;学⽣买票时,是优惠买票(5折或75折);军⼈买票时是优先买票。再⽐如,同样是动物叫的⼀个⾏为(函数),传猫对象过去,就是”(>^ω^<) 喵“,传狗对象过去,就是"汪汪"。
2.多态的实现与定义
2.1多态的构成条件
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了
Person。Person对象买票全价,Student对象优惠买票。
实现多态的两个必要条件:• 必须指针或者引⽤调⽤虚函数• 被调⽤的函数必须是虚函数。
说明:要实现多态效果,第⼀必须是
基类的指针或引⽤
,因为只有基类的指针或引⽤才能既指向派⽣
类对象;第⼆派⽣类必须对
基类的虚函数重写/覆盖
,重写或者覆盖了,派⽣类才能有不同的函数,多
态的不同形态效果才能达到

2.2虚函数
类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。注意⾮成员函数不能加virtual修
饰。
1 class Person2 {3 public :4 virtual void BuyTicket () { cout << " 买票 - 全价 " << endl;}5 };
2.3虚函数的重写/覆盖
虚函数的重写/覆盖:派⽣类中有⼀个跟基类完全相同的虚函数(即派⽣类虚函数与基类虚函数的
返回值类型、函数名字、参数列表完全相同
返),称派⽣类的虚函数重写了基类的虚函数。
注意:在重写基类虚函数时,派⽣类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承
后基类的虚函数被继承下来了在派⽣类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样
使⽤,不过在考试选择题中,经常会故意买这个坑,让你判断是否构成多态。
class Person {public :virtual void BuyTicket () { cout << " 买票 - 全价 " << endl; }};class Student : public Person {public :virtual void BuyTicket () { cout << " 买票 - 打折 " << endl; }};void Func (Person* ptr){// 这⾥可以看到虽然都是 Person 指针 Ptr 在调⽤ BuyTicket// 但是跟 ptr 没关系,⽽是由 ptr 指向的对象决定的。ptr-> BuyTicket