条款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);

本文深入探讨了C++中类、对象、静态类型与动态类型的概念,详细解释了如何通过虚函数实现动态绑定,并阐述了带有默认参数的虚函数的特性。文章还展示了动态类型如何在执行过程中改变,以及这如何影响对象的行为。
773

被折叠的 条评论
为什么被折叠?



