【C++】多态

前言

本篇博客我们来介绍多态知识的总结,这一部分面试官特别爱提问,也是我们需要注意的

💓 个人主页:小张同学zkf

⏩ 文章专栏:C++

若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

 

 

目录

1.多态的概念

2.多态的实现与定义

2.1多态的构成条件

2.2虚函数

2.3虚函数的重写/覆盖 

2.4虚函数重写的其他问题 

2.5override 和 final关键字

2.6重载/重写/隐藏的对比 

3.纯虚函数和抽象类

4.多态的原理

4.1虚函数表指针  

4.2多态是如何实现的

4.3动态绑定与静态绑定

4.4虚函数表


1.多态的概念

多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为 编译时多态(静态多态) 运⾏时多态(动态多态) ,编译时多态(静态多态)主要就是我们前⾯总结的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。
运⾏时多态,具体点就是去完成某个⾏为(函数),可以传不同的对象就会完成不同的⾏为,就达到多种形态。⽐如买票这个⾏为,当普通⼈买票时,是全价买票;学⽣买票时,是优惠买票(5折或75折);军⼈买票时是优先买票。再⽐如,同样是动物叫的⼀个⾏为(函数),传猫对象过去,就是”(>^ω^<) 喵“,传狗对象过去,就是"汪汪"。

 


2.多态的实现与定义

2.1多态的构成条件

多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了
Person。Person对象买票全价,Student对象优惠买票。
实现多态的两个必要条件:
• 必须指针或者引⽤调⽤虚函数
• 被调⽤的函数必须是虚函数。
说明:要实现多态效果,第⼀必须是 基类的指针或引⽤ ,因为只有基类的指针或引⽤才能既指向派⽣ 类对象;第⼆派⽣类必须对 基类的虚函数重写/覆盖 ,重写或者覆盖了,派⽣类才能有不同的函数,多 态的不同形态效果才能达到

2.2虚函数

类成员函数前⾯加virtual修饰,那么这个成员函数被称为虚函数。注意⾮成员函数不能加virtual修
饰。
1 class Person
2 {
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
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值