C++学习笔记(三):动态绑定与静态绑定
要触发动态绑定,需满足两个条件:
(1)只有虚函数才能进行动态绑定,非虚函数不进行动态绑定。
(2)必须通过基类类型的引用或指针进行函数调用。
基类类型的引用或指针可以引用基类类型对象,也可以引用派生类类型对象。
(1)对象的静态类型:对象在声明时采用的类型。是在编译期确定的。
(2)对象的动态类型:目前所指对象的类型。是在运行期决定的。
简单点说:静态类型是用于声明指针的类型,而动态类型则是指针指向的实际类型。
class B{
public:
virtual void func();
};
class D : public B{
public:
virtual void func();
};
D *p1 = new D();
B *p2 = p1;
p1->func()与p2->func()为同一函数,因为func()是一个虚函数,动态绑定,也就是说它绑定的是对象的动态类型,p1和p2指向同一个对象,所以是同一函数。
特殊情况:
虚函数是动态绑定的,缺省参数是静态绑定的。
class B{
public:
virtual void func(int i = 10){
cout << i<< endl;
}
};
class D : public B{
public:
virtual void func(int i = 20){
cout <<i <<endl;
}
};
D *p1 = new D();
B *p2 = p1;
此时,p1->func()为20,p2->func()为10,因为缺省参数是静态绑定的
注意:《Effective C++》条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function’s inherited default parameter value)