早绑定和晚绑定

虚函数和一般函数(早绑定与晚绑定)

说早绑定和晚绑定的时候,先来看看绑定的意思吧。
绑定的英文名为binding:把函数体和函数调用相联系称为绑定。
类中的一般的函数都是早绑定,也就是说:在调用的地方,就已经把要调用的函数确定好了,调用的类就是定义它的类。现在的“向上映射”就会导致早绑定的问题:
代码:
#include<iostream>
using namespace std;
class A{
   int a;
public :
   A(){a=0;}
   void print(){cout<<”A-father”<<endl;}
};

class A1:public A{
   int a;
public :
   A(){a=0;}
   void print(){cout<<”A1-children”<<endl;}
};

void print(A& i){
i.print();
};

void main(){
A& a = new A1;
print(a);
}
上面就是早绑定的例子,得到的输出也是:A-father,原理和简单,首先i.print()的时候,就与类型为A的printf()函数绑定了,所以自然调用的是A中的函数啦。现在我们来说下晚绑定:
我们现在在A中的printf()前面加上vitrual,这样就变成了虚函数啦,也就是晚绑定啦,来卡看它的实现:
同样,i.print()的时候去找A中的函数,但是发现函数是虚拟的,所以去其指向的对象中找vtpr指针,然后找vptr中找其函数(原理见think in c++中的14章,多态与虚函数),然后这样实现晚绑定。
在实验中:发现了类中的函数地址是没有的,以及一般的函数地址就是函数名,但是要强制类型转换。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值