【每日一练】】(第7期)C++编程规范之类的设计2

以下是披着面向对象外衣的面向过程编程(我们项目里面有很多这样的情况),请改编成真正的面向对象程序。

class T { };

class T1 : public T 
{ 
public:
  void DoSth1(){ } 
};

class T2 : public T 
{ 
public:
  void DoSth2(){ } 
};

void foo(T* pT)
{
  T1* pT1 = dynamic_cast<T1*>(pT);
  if (pT1 != NULL) {
    pT1->DoSth1();
  }

  T2* pT2 = dynamic_cast<T2*>(pT);
  if (pT2 != NULL) {
    pT2->DoSth2();
  }
}


 

参考答案:

C++的面向对象风格:

struct T { virtual void Do()=0; //新增的 };
struct T1:public T 
{
  virtual void Do() { DoSth1(); }
  void DoSth1(){ } 
};
struct T2:public T 
{ 
  virtual void Do() { DoSth2(); }
  void DoSth2(){ }
};

void foo(T* pT)  //客户端代码
{
    pT->Do(); //使用虚函数替换dynamic_cast
}



面向对象相对面向过程的优势在哪里?更好的符合开闭原则(对扩展开放,对修改关闭)。

例如要增加T3类型,面向过程的代码里面要修改已有代码foo函数(增加分支),

面向对象的代码只要增加T3类型就OK了,不需要改动客户端代码(foo函数),

这叫向后兼容(后人写的程序可以被前人调用)。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值