在腾讯笔试题遇到一个动态绑定的问题,所以研究一下,水平有限,说的不对请多指教
有如下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();}
这里,在构造函数或者析构函数里调用虚函数,此时虚函数不具有多态性。