设计模式 之 里氏替换原则 C++

里氏替换原则是面向对象设计的基本原则之一,它约束了类的继承行为。该原则指出,子类应当可以替换父类并保持程序的正确性。在C++中,遵循这一原则能确保代码的灵活性和可扩展性。文章通过示例展示了如何在实际编程中应用里氏替换原则,并强调了违反原则可能导致的问题,如子类覆盖父类方法时需保持前置条件和后置条件的一致性。

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

里氏替换原则。 是对类继承的约束。 

定义: 1。If for each object o1 of type S there is an object o2 of type T such that for all programs P defined of T , the behavior of P is unchanged when o1 is subsituted for o2 then S is a type of T. (如果对每一个类型为S的对象o1 , 都有类型为T的对象o2,使得以T定义的程序P在所有的对象o1都替换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

2.Founctions that use pointers or references to base classes must be able to use objects of dirvers classes without knowing it .


注意:如果自雷不能完整的实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、关联的关系代替继承。


‘契约设计’ 制定前置条件和后置条件,前置条件就是你要执行就必须满足我的条件;后置条件就是我执行完了需要反馈,标准是什么。

子类中的前置条件必须与父类中被覆写的方法的前置条件相同或者更宽松。




注意// 省略构造函数和析构函数  

基类 AbstractGun 

class AbstractGun

{

   virtual void shoot();

}

class MachineGun:public AbstractGun

{

  virtual void shoot();

}

void  MachineGun::shoot()
{
printf("机枪 射击");

}

void  Rifir::shoot()
{
printf("狙击 射击");
}

void  HandGun::shoot()
{
printf("手枪 射击");
}

void  ToyGun::shoot()
{
printf("玩具枪 射击");
}

void Solider::setGun(AbstractGun gun)

{

  this.gun = gun;

}

void Solider::shoot()

{

 gun->shoot();

}

void main()

{

   Solider *solider = new Solider();

 solider->setGun(new RIfir);

 solider->killEmeny();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值