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

来源:互联网 发布:无损音质软件 编辑:程序博客网 时间:2024/06/05 22:46

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

有如下C++代码:
1
2
3
4
5
6
7
8
9
structA{
  voidfoo(){printf("foo");}
  virtualvoid bar(){printf("bar");}
  A(){bar();}
};
structB:A{
  voidfoo(){printf("b_foo");}
  voidbar(){printf("b_bar");}
};
那么        
1
2
3
A *p=newB;
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();}这里,在构造函数或者析构函数里调用虚函数,此时虚函数不具有多态性。


0 0