对象的静态类型:对象在声明是采用的类型,在编译期确定;

对象的动态类型:当前对象所指的类型,在运行期决定,对象的动态类型可以更改,但静态类型无法更改。

静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期。

动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期。

答案:是的,vfun() 是个虚函数,它是动态绑定的,也就是它绑定的是对象的动态类型,b 和 d 虽然静态类型不同,但他们指向同一个对象,他们的动态对象是相同的,都是 D*,所以,他们调用的是同一个函数:D::vfun()。

上面都是针对对象指针的情况,对于引用(reference)的情况同样适用。

总结:只有虚函数才使用的是动态绑定,其他的全部是静态绑定。

当缺省参数和虚函数一起出现的时候情况有点复杂,极易出错。我们知道,虚函数是动态绑定的,但是为了执行效率,缺省参数是静态绑定的。

对于这个特性,估计没有人会喜欢。所以,永远记住: