C++中的多态 详细讲解

目录

一、多态的概念

二、多态的定义及实现

1.多态的构成条件

2.虚函数

3.虚函数的重写

4.C++11 override 和 final

5.重载、覆盖(重写)、隐藏(重定义)的对比

三、抽象类

四、多态的原理

1.虚函数表

2.多态的原理

3.动态绑定与静态绑定

五、单继承和多继承关系中的虚函数表

1.单继承中的虚函数表

2.多继承中的虚函数表

3.菱形继承、菱形虚拟继承

六、完结撒❀

前言:

需要声明的,本博客中的代码及解释都是在vs2022下的 x86 程序中,涉及的指针都是 4bytes 。如果要其他平台下,部分代码需要改动。比如:如果是 x64 程序,则需要考虑指针是 8bytes 问题等等

一、多态的概念

多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会
产生出不同的状态

举个栗子:比如 买票这个行为 ,当 普通人 买票时,是全价买票; 学生 买票时,是半价买票; 军人
买票时是优先买票。
再举个栗子: 最近为了 争夺在线支付市场 ,支付宝年底经常会做诱人的 扫红包 - 支付 - 给奖励金
活动。那么大家想想为什么有人扫的红包又大又新鲜 8 块、 10 ... ,而有人扫的红包都是 1 毛, 5
.... 。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如
你没有经常支付宝支付等等,那么你需要被鼓励使用支付宝,那么就你扫码金额 =
random()%99 ;比如你经常使用支付宝支付或者支付宝账户中常年没钱,那么就不需要太鼓励你
去使用支付宝,那么就你扫码金额 = random()%1 ;总结一下: 同样是扫码动作,不同的用户扫
得到的不一样的红包,这也是一种多态行为。 ps :支付宝红包问题纯属瞎编,大家仅供娱乐。

二、多态的定义及实现

1.多态的构成条件

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如 Student 继承了
Person Person 对象买票全价, Student 对象买票半价。
那么在继承中要 构成多态还有两个条件
1)必须通过基类的指针或者引用调用虚函数
2)被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

2.虚函数

虚函数:即被 virtual 修饰的类成员函数称为虚函数。
class Person {
public:
    virtual void BuyTicket() { cout << "买票-全价" << endl;}
};

3.虚函数的重写

虚函数的重写 ( 覆盖 ) 派生类中有一个跟基类完全相同的虚函数 ( 即派生类虚函数与基类虚函数的
返回值类型、函数名字、参数列表(缺省参数可以不同)完全相同 ) ,称子类的虚函数重写了基类的虚函数。
class Person {
public:
	virtual void BuyTicket() { cout << "买票-全价" << endl; }
};
class Student : public Person {
public:
	virtual void BuyTicket() { cout << "买票-半价" << endl; }
	/*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因
	为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议
	这样使用*/
	/*void BuyTicket() { cout << "买票-半价" << endl; }*/
};
void Func(Person& p)
{
	p.BuyTicket();
}
int main()
{
	Person ps;
	Student st;
	Func(ps);
	Func(st);
	return 0;
}
虚函数重写的两个例外:
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值