条款37:静态绑定与动态绑定
Class Shape{
Public:
Enum ShapeColor { red, Green, Blue };
Virtual void draw(ShapeColor color=red) const=0;
………
};
Class Rectangle:public Shape{
Public:
Virtual void draw(Shape color=Green) const;
……
};
Class Circle:public Shape{
Public:
Virtual void draw(ShapeColor color) const;
};
Shape* ps; //静态类型为shape*, 没有动态类型,因为它还没指向任何对象
Shape* pc=new Circle; //静态类型为shape*, 动态类型为circle*
Shape* pr=new Rectangle;//静态类型为shape*, 动态类型为rectangle*
- Ps,pc,pr它们的静态类型都是shape*
- 对象的动态类型则是”目前所指对象的类型”,也就是说动态类型可以表现出一个对象将会有什么行为
- 动态类型可以在执行的过程中改变,例如
a) ps=pc; // ps的动态类型为circle*
b) ps=pr;// ps的动态类型变为rectangle* - Virtual函数系动态绑定而来,意思是调用一个virtual函数的时候,究竟是调用哪一份函数的实现代码取决于发出调用的那个对象的动态类型,例如
a) Pc->draw(Shape::red); //调用的是Circle::draw(Shape::red);
b) Pr->draw(Shape::red); //调用的是Rectangle::draw(Shape::red); - 带缺省参数的virtual函数:首先明确一点,virtual函数是动态绑定的,而缺省参数值确是静态绑定的。
例如:a) Pr->draw(); //调用的是Rectangel::draw(Shape::red)而不是Rectangel::draw(Shape::Green);