C++ 多态性及其原理

简而言之,多态就是多种形态,对同一件事,不同的对象的处理动作有多种形态。

C++ 的多态性有两种,一种是静态多态,一种是动态多态

静态多态:

静态多态时编译时多态,主要的体现方式时函数重载。

函数重载:在同一作用域,定义多个同名的函数,这些函数可能是函数的参数类型不同,函数参数顺序不同,或者函数参数的个数不同,满足以上条件则构成了函数重载(与函数的返回值类型无关)。

静态多态原理:与C++函数名的修饰有关,在编译过程中有四个阶段:

1、预处理:把头文件当中的函数声明拷贝到源文件,避免译过程中的语法分析找不到函数定义。

2、编译:语法分析,同时进行符号汇总(函数名)

3、汇编:生成函数名到函数地址的映射,方便之后通过函数名找到函数定义位置,从而执行函数

4、连接:将多个文件中的符号表进行汇总合并

函数名修饰规则:ZN+类长度+类名+函数名长度+函数名+E+类型首字母

通过函数名修饰规则,把这些同名的函数修饰成具有细微差异的函数,从而达到函数重载的效果。

动态多态:

动态多态是运行时多态,体现在对于基类虚函数的重写。

虚函数重写:

1、在基类的函数前加上 virtual 关键字,在派生类对其重写。

2、运行时会根据对象的类型来调用对应的函数。

3、如果调用的对象时基类,则会调用基类的函数。

4、如果调用的对象时派生类,则会调用派生类的函数。

原理:

1、早绑定:编译器编译时已经确定对象调用的函数的地址(不使用virtual关键字)

2、晚绑定:若类使用 virtual函数,则会为类生成虚函数表(一维数组,存放了虚函数地址),类对象构造时会初始化该虚函数表指针,虚函数表指针在构造函数中初始化。

虚函数表:

它是一个存储类中虚函数地址的数据结构。当一个类中包含虚函数时,编译器会为该类创建一个虚函数表。这个表中按顺序存放着该类中所有虚函数的地址。

虚函数表指针:

每个含有虚函数的类的对象中都有一个隐藏的虚函数表指针。这个指针指向该对象所属类的虚函数表。通过这个指针,在运行时可以根据实际对象的类型准确地找到相应的虚函数地址并执行,从而实现动态绑定,也就是多态行为。当通过基类指针或引用调用虚函数时,系统会根据对象实际所指向的类型,通过虚函数表指针找到对应的虚函数并执行。这样就可以在运行时根据对象的具体类型来决定执行哪个具体的虚函数,实现了灵活的多态性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值