您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记(三):动态绑定与静态绑定

2012-10-28 23:51 281 查看
要触发动态绑定,需满足两个条件:

(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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: