Effective C++学习系列之静态绑定与动态绑定

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

条款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*
  1. Ps,pc,pr它们的静态类型都是shape*
  2. 对象的动态类型则是”目前所指对象的类型”,也就是说动态类型可以表现出一个对象将会有什么行为
  3. 动态类型可以在执行的过程中改变,例如
    a) ps=pc; // ps的动态类型为circle*
    b) ps=pr;// ps的动态类型变为rectangle*
  4. Virtual函数系动态绑定而来,意思是调用一个virtual函数的时候,究竟是调用哪一份函数的实现代码取决于发出调用的那个对象的动态类型,例如
    a) Pc->draw(Shape::red); //调用的是Circle::draw(Shape::red);
    b) Pr->draw(Shape::red); //调用的是Rectangle::draw(Shape::red);
  5. 带缺省参数的virtual函数:首先明确一点,virtual函数是动态绑定的,而缺省参数值确是静态绑定的。
    例如:a) Pr->draw(); //调用的是Rectangel::draw(Shape::red)而不是Rectangel::draw(Shape::Green);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值