c++学习笔记-动态绑定

在腾讯笔试题遇到一个动态绑定的问题,所以研究一下,水平有限,说的不对请多指教大笑

有如下C++代码:
1
2
3
4
5
6
7
8
9
struct A{
   void foo(){ printf ( "foo" );}
   virtual void bar(){ printf ( "bar" );}
   A(){bar();}
};
struct B:A{
   void foo(){ printf ( "b_foo" );}
   void bar(){ printf ( "b_bar" );}
};
那么        
1
2
3
A *p= new B;
p->foo();
p->bar();
 

  这个题的结果是barfoob_bar

为什么㖏,我们研究下哈,

首先说明一下,那两各foo()是非需函数,这是个不好的写法,他在这里只是说明动态绑定这个东西;

首先说一下说明是动态绑定:

动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。
动态绑定是将一个过程调用与相应代码链接起来的行为。是指与给定的过程调用相关联的代码,只有在运行期才可知的一种绑定,他是 多态实现的具体形式。

以上是百度百科中的 借鉴一下,差不多就是这个意思。

现在我们定一个B* d,这时候d->foo();和p->foo();调动的是同一个函数吗?答案很明显是否定;

这里虽然函数名一样,但已经是静态绑定了,两个类型分别调用自己类内定义的foo()函数。

这时候在看一下p->bar  这里虽然p是个A型的指针,但是执行代码时涉及到一个动态绑定问题,p的实际类型是个B,所以调用B函数的bar()而不是A的;

最后总结一句话,只有虚函数才涉及到动态绑定,其他可以说都是静态绑定。

注意:A(){bar();}这里,在构造函数或者析构函数里调用虚函数,此时虚函数不具有多态性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值