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)
(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)
相关文章推荐
- 关于静态绑定与动态绑定的辨别笔记----C++学习之路
- Java学习笔记之深入理解动态绑定和静态绑定
- C++的动态绑定(Boolan笔记第五周)
- C++中动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定
- Android开发学习笔记:为动态添加的Spinner控件绑定数据源以及监听事件
- 虚函数和动态绑定 C++学习
- C++学习笔记【第二部分第十二章:动态内存】
- Programming in Objective C学习笔记03——多态、动态绑定和动态类型
- 虚函数和动态绑定 C++学习
- 深入理解C++的动态绑定和静态绑定
- C++动态内存创建与内存管理学习笔记[1]
- c++的动态绑定和静态绑定
- C++动态内存创建与内存管理学习笔记[2]
- 深入理解C++的动态绑定和静态绑定
- C++的动态绑定和静态绑定
- 学习笔记——关于动态绑定和属性初始化
- 深入理解C++的动态绑定和静态绑定
- 深入理解C++的动态绑定和静态绑定