C++:动态联编之虚函数

1.什么是联编?

        编译器在编译时,将函数调用解释为所执行的代码块称为函数名联编(binding)。在C中没有函数重载和重写,因此可以直接按函数名查找。但面对C++的重写和多态性,将函数名名联编分为下面两个:静态联编、动态联编

2.函数名联编的区别

两个不同的联编对应不同的任务。对于类C的代码以及可以在编译时即可以编译的函数代码块成为静态联编。例如:类C的代码,函数原型的定义(重载)都可以通过静态联编确定代码块。

然而,当编译器面临只能够在程序运行时才能选择使用正确的虚函数的代码的方式成为动态联编。编译器对于非虚函数采用的为静态联编。

因此,多态的问题直接面临的就是,使用基类引用或者指针来调用派生类对象,因为上述两种方式可以通过将基类引用或者指针来指向派生类对象来调用基类的方法,但反过来却不可以。(前提)

void fr(base *r){...}
void fp(base &p){...}
int main()
{
    Base b=new b();
    BasePlus bp=new BasePlus();
    fr(b);
    fr(bp);
    fp(b);
    fp(bp);
}

(结果)这才是要动态联编的关键,即在调fr,fp函数的时候,如果不使用动态联编,在编译调用函数的时候,不知道到底该调用什么哪一个函数代码(即对上述fr,fp虚函数进行重写的时候),采用动态联编可以直接编译,不管到底使用那个虚函数块,因为虚函数采用了虚函数表的格式。

虚函数表:每一个包含虚函数的类,在生成对象的时候,都在对象头部包含一个指向虚函数的指针,因此可以在运行时直接快速查找到需要运行的虚函数代码块

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值