私有继承和虚函数私有化能用么?

源起

以前就知道private私有化声明关键字,和virtual虚函数关键字两者并不冲突,可以同时使用。
但是,它所表示的场景没有那么明晰,也觉得难以理解,直到近段时间遇到一个具体场景。

场景

借助ACE遇到的问题进行展示

架构图

架构图

序列图

序列图

说明

  • ACE_Message_Queueenqueue入队的时间,通过notification_strategy接口可定制入队列的通知事件,以实现某些过程间的桥接

  • ACE_Svc_Handler因为继承ACE_Task具有线程能力和消息队列,和继承ACE_Event_Handler事件处理机制,以及内聚了Reactor,在使用方消息请求入队后,ACE_Svc_Handler通过handle_output接口可将消息外发出去。

通过handle_output机制,可以实现套接字的异步发送能力和消息缓冲机制。具体借助Reactor监控套接字的writable事件,即使出现部分成功发送的场景,也能够予以很好的解决,见前面博客详述如何解决TCP部分发送成功

如何定制化数据入队通知策略

我们可以选择定制通知策略类notification strategy内聚成为成员变量,但此成员变量又需要访问容器类的详细状态,以避免过度的通知,所以,两者的关系十分密切和相互依赖,甚至需要用到类前置声明来解决问题。

既然这么密切,如果选择用继承呢?但首先,遇到的是判断问题,它们之间是is a,还是has a关系?确实选择继承,在is a概念比较勉强,因为它仅供自身使用,并不通用!

那么使用私有继承呢?而且涉及到的ACE_Notification_Strategy所有虚函数接口也均采用private关键字进行修饰,以避免"外界"显式访问,是否就达到比较好的适应呢?

结束语

继承能不能用?甚至私有继承能不能用?虚函数能不能私有化?如果场景适合,何乐而不为呢?😃

ACE优良的类设计,保证了多继承之间也不会出现太多命名冲突,实在是高明的设计

例子


class SomeExtendCls: public ACE_Svc_Handler<ACE_SOCK_Stream, ACE_MT_SYNCH>, private ACE_Notification_Strategy
{
public:
   typedef ACE_Svc_Handler<ACE_SOCK_Stream, ACE_MT_SYNCH> super;
    SomeExtendCls():ACE_Notification_Strategy(this, ACE_EventHanlder::WRITE_MASK)
    {
     ...
    }
  ...

private:
  // Notification strategy APIs
  virtual int   notify (void)=0;
  virtual int   notify (ACE_Event_Handler *, ACE_Reactor_Mask mask)=0;

  ...

}

// implementation

int SomeExtendCls::open(void *acceptor_or_connector)
{
    if(super::open(acceptor_or_connector) == -1)
    {
      return -1;
    }
    
    ...
    
    // Set msg quque notifier
    this->event_handler(this);
    this->mask(ACE_EventHanlder::WRITE_MASK);
    this->msg_queue()->notification_strategy(this);
    
    ...
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值