多态实现原理

静态多态

函数重载:

        在编译期确定的,允许在同一作用域中声明多个功能类似的同名函数,这些函数的参数列表,参数个数或参数类型或者参数顺序都不一样,不能通过返回值类型来区别重载


静态多态实现原理        

函数名修饰:

        在编译和汇编阶段生成符号表,在这个阶段会对函数进行修饰,让它在符号表中有些许差异

编译过程:

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

        编译:语法分析,符号汇总,生成符号表(针对函数名)

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

        链接:把前面多个源文件生成的符号表进行汇总合并


动态多态

虚函数重写:

        运行时确定,在基类的函数前面加上virtual关键字,运行时会根据对象的类型来调用相应的函数,如果类型是基类,则调用基类函数,如果类型是派生类,则调用派生类的函数

动态多态实现原理

        早绑定:编译器编译时已经确定对象调用的函数的地址

        晚绑定:若类使用virtual函数,则会为类生成虚函数表(一维数组,存放了虚函数地址),类对象构造时会初始化该虚函数指针(如果类中有虚函数,没有默认构造函数,编译器为为它自动生成一个默认构造函数,目的是初始化该虚函数表指针),虚函数表指针在构造函数中初始化

示例:

Class Base
{
public:
    virtual void func(){
        cout<<"Base::func"<<endl;
    }
};

class Drive : public Base{
public:
    void func(){
        cout<<"Drive::func"<<endl;
    }

int mian(){
//获取虚函数表
typedef void (*Func)(void);
Base *pbase1 = new Base();
Base *pbase2 = new Base();

long * vptr1 = (long*)*(long*)pbase1;
Func f1 = (Func)vptr1[0];//取出第一个函数
f1();


long * vptr2 = (long*)*(long*)pbase2;
Func f2 = (Func)vptr1[0];
f2();

return 0;
}

//结果
//Base::func
//Drive::func

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值