对象的静态类型:就是它在程序中被声明时的类型。
对象的动态类型:,则是指“目前所指对象的类型”,动态类型可以表现出一个对象将会有什么行为。
静态绑定:
又名前期绑定,如缺省参数值绑定。
动态绑定:
又名后期绑定,如virtual是动态绑定而来,意思是调用一个virtual函数时,究竟调用哪一份函数实现代码,取决与发出调用是那个对象的动态类型。
class Shape {
public:
enum ShapeColor{ Red,Green,Blue};
virtual void draw(ShapeColor color = Red)const = 0;
};
class Rectangle :public Shape {
public:
void draw(ShapeColor color = Green) const {
cout << "Rec color = " << color << endl;
}
};
class Circle :public Shape {
public:
void draw(ShapeColor color)const {
cout << "Cir color = " << color << endl;
}
};
注意这个函数:
class Rectangle :public Shape {
public:
void draw(ShapeColor color = Green) const {
cout << "Rec color = " << color << endl;
}
};
静态绑定下,Rectangle的draw函数并不从Base继承缺省参数值-->Green。
而动态绑定下无论它的缺省参数是什么,draw会从Base继承缺省参数值-->Red
Shape* ps=new Circle;
ps->draw();//动态绑定
Shape* pr = new Rectangle;//动态绑定
pr->draw();
Rectangle s_rec;//静态绑定
s_rec.draw();