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

源起

以前就知道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 APIsvirtual int   notify (void)=0;virtual int   notify (ACE_Event_Handler *, ACE_Reactor_Mask mask)=0;...}// implementationint SomeExtendCls::open(void *acceptor_or_connector)
{if(super::open(acceptor_or_connector) == -1){return -1;}...// Set msg quque notifierthis->event_handler(this);this->mask(ACE_EventHanlder::WRITE_MASK);this->msg_queue()->notification_strategy(this);...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/91923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数&#xff0c;有什么作用&#xff1f;50、 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;51、简述一下虚函数和纯虚函数&#xff0c;以及实现原理&#xff1f;52、说说纯虚函数能实例化吗&#xff0c;为什么&am…

通过code2Session接口获取openId(上)

//导入request请求工具类 import {getBaseUrl,getWxLogin,getUserProfile,requestUtil} from ../../utils/requestUtil; import regeneratorRuntime from ../../lib/runtime/runtime; Page({/*** 页面的初始数据*/data: {address:{},baseUrl:,cart:[],totalPrice:0,totalNum:0}…

【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解

这个双向链表采用的是有伪头节点和伪尾节点的 与上一篇文章中单链表的实现不同&#xff0c;区别于在实例化这个链表时就初始化了的伪头节点和伪尾节点&#xff0c;并相互指向&#xff0c;在第一次添加节点时&#xff0c;不需要再考虑空指针指向问题了。 /*** 通过链表与HashMa…

030-从零搭建微服务-消息队列(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;mingyue: &#x1f389; 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning

2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务&#xff08;相似子轨迹搜索、轨迹预测和轨迹聚类&#xff09;最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类&#xff1a; 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…

Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)

Flutter笔记 无限滚动与动态加载的实现&#xff08;GeX简单状态管理版&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq…

idea常用快捷键 idea搜索快捷键

常用快捷键 IntelliJ IDEA 是一款流行的 Java 集成开发环境&#xff08;IDE&#xff09;&#xff0c;有许多常用的快捷键可以帮助开发者提高效率。以下是一些常用的 IntelliJ IDEA 快捷键&#xff1a; CtrlSpace&#xff1a;基本代码补全&#xff0c;用于输入任何东西&#x…

stm32 - 初识2

stm32 - 初识2 工程架构点灯程序寄存器方式点灯库函数的方式点灯 工程架构 启动文件 中断向量表&#xff0c;中断服务函数&#xff0c;其他中断等 中断服务函数中的&#xff0c;复位中断是整个程序的入口&#xff0c;调用systeminit&#xff0c;和main函数 点灯程序 寄存器方式…

HTML的相关知识

1.什么是HTML&#xff1f;基本语法 HTML: Hyper Text Markup Language &#xff08;超文本标记语言&#xff09; 超文本&#xff1f;超级文本&#xff0c;例如流媒体&#xff0c;声音、视频、图片等。 标记语言&#xff1f;这种语言是由大量的标签组成。HTML标签参考手…

尚硅谷谷粒商城部分报错问题处理

1、启动报错&#xff1a; 内容&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name attrAttrgroupRelationController: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed t…

《数据结构、算法与应用C++语言描述》-栈的应用-离线等价类问题

离线等价类问题 问题描述 等价类&#xff1a;假定一个具有n个元素的集合U1&#xff0c;2&#xff0c;…&#xff0c;n和一个具有r个关系的集合 R &#xff08; i 1 &#xff0c; j 1 &#xff09;&#xff0c;&#xff08; i 2 &#xff0c; j 2 &#xff09;&#xff0c; ……

推出全新AIGameFi,SCF金融公链FinSOUL促进元宇宙发展

在被誉为元宇宙元年的2021年&#xff0c;SCF&#xff08;Standard Cross Finance&#xff09;金融公链正着眼于打造一项开创性的项目&#xff0c;推出创新的金融公链生态&#xff0c;并期待成为元宇宙2.0的先锋。虽然2021年见证了元宇宙项目的强势崛起&#xff0c;但在SCF金融公…

Vue定义全局组件的方式

Vue.js是一种流行的JavaScript框架&#xff0c;用于构建交互式的Web应用程序。Vue提供了一种简单而灵活的方式来定义和使用组件。在本文中&#xff0c;我们将探讨Vue中定义全局组件的三种方式&#xff0c;让你能够更好地理解和使用Vue组件。 引言 组件是Vue应用程序的基本构建…

【C++】class的设计与使用(十)重载iostream运算符

希望对某个类对象进行读写操作&#xff0c;直接cout<<类对象<<endl;或cin>>类对象;编译器会报错&#xff0c;所以我们必须提供一份重载的input/output运算符&#xff1a; 重载ostream运算符 ostream& operator<<(ostream &os, const Triangu…

Redis配置和优化

Redis配置和优化 一 、Redis介绍二、关系数据库和非关系数据库2.1、关系型数据库2.2、 非关系型数据库2.3、 非关系型数据库的产生背景2.4、 关系型数据库和非关系型数据库区别2.5、 总结 三、缓存概念3.1、系统缓存3.2、 缓存保存位置及分层结构3.2.1、DNS缓存3.2.2、 应用层缓…

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…

MySQL数据库基础与概念解析

在如今这个信息爆炸的时代,数据成了我们生活中不可或缺的一部分。但是,数据本身并没有太大的价值,真正重要的是我们如何管理和利用这些数据。这就引出了数据库这一概念,一个系统化、高效的数据管理工具。 特别是在复杂的应用场景中,比如游戏《三国志》系列,一个好的数据…

【HTML】表格行和列的合并

概述 当我们需要在 HTML 表格中展示复杂的数据时&#xff0c;行和列的合并可以帮助我们实现更灵活的布局和结构。通过合并行和列&#xff0c;我们可以创建具有更多层次和结构的表格&#xff0c;使数据更易于理解和分析。 在 HTML 表格中&#xff0c;我们可以使用 rowspan 和 …

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

Debian跳过grub页面

nano /etc/default/grub将GRUB_TIMEOUT的值改为0 将GRUB_CMDLINE_LINUX_DEFAULT的值改为"quiet splash" 如果要禁用开局日志的话&#xff0c;将GRUB_CMDLINE_LINUX_DEFAULT的值改为"quiet splash loglevel0" update-grub