当前位置: 首页 > news >正文

【C++ Miscellany】继承体系非尾端类设计为抽象类

部分赋值问题

用软件来处理两种动物:蜥蜴和鸡

class Animal
{
public:Animal& operator = (const Animal& rhs);...
};class Lizard: public Animal
{
public:Lizard& operator = (const Lizard& rhs);...
};class Chicken: public Animal
{Chicken& operator = (const Chicken& rhs);...
};

以下代码将导致只有“liz1的Animal成分”被修改,即部分赋值问题:

Lizard liz1;
d liz2;Animal* pAnimal1 = &liz1;
Animal* pAnimal2 = &liz2;
...
*pAnimal1 = *pAnimal2;

解决一:

让赋值操作符成为虚函数

class Animal
{
public:virtual Animal& operator = (const Animal& rhs);...
};class Lizard: public Animal
{
public:virtual Lizard& operator = (const Animal& rhs);...
};class Chicken: public Animal
{virtual Chicken& operator = (const Animal& rhs);...
};Lizard liz;
Chicken chick;Animal* pAnimal1 = &liz;
Animal* pAnimal2 = &chick;
...
*pAnimal1 = *pAnimal2;	//任何类型的Animal出现在赋值动作的右边

如果Animal::operator=是虚函数,先前的赋值行为就会调用正确的Lizard的操作符;缺点是:运行期间要进行所有类型的检验区分操作,于是使用dynamic_cast协助完成任务,但又会为动态判断付出复杂度和成本。

解决二:

将Animal设计为抽象类:

  • 允许Animal对象互相赋值
  • 禁止部分赋值和异型赋值
  • 派生类的赋值操作符可以调用基类的赋值操作符。
class AbstractAnimal 
{ 
protected:Animal& operator=(const Animal& rhs); public: virtual ~Animal() = 0; 
}; class Lizard: public Animal 
{ 
public: Lizard& operator=(const Lizard& rhs); 
}; class Chicken: public Animal 
{ 
public: Chicken& operator=(const Chicken& rhs); 
};

总结

你发现自己需要产生一个具体类,继承自程序库的一个具体类,而你只能使用该程序库,不能修改,怎么办?

  1. 将你的具体类派生自既有的(程序库中的)具体类,但需要注意本条款一开始所验证的赋值相关问题等;
  2. 试着在程序库集成体系中找到更高的抽象类,其中有你需要的大部分功能,继承它;
  3. 以“你所希望继承的那个程序库类”来实现你的新类;
  4. 手上有什么就用什么。

一般性的法则是:继承体系中的non-leaf(非尾端)类应该是抽象类。

相关文章:

【C++ Miscellany】继承体系非尾端类设计为抽象类

部分赋值问题 用软件来处理两种动物:蜥蜴和鸡 class Animal { public:Animal& operator (const Animal& rhs);... };class Lizard: public Animal { public:Lizard& operator (const Lizard& rhs);... };class Chicken: public Animal {Chicken…...

Leetcode236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...

Swift SwiftUI CoreData 过滤数据 2

预览 Code import SwiftUI import CoreDatastruct HomeSearchView: View {Environment(\.dismiss) var dismissState private var search_value ""FetchRequest(entity: Bill.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Bill.c_at, ascending: false)…...

解决maven骨架加载慢问题(亲测解决)

1、下载archetype-catalog.xml 网站 : https://repo.maven.apache.org/maven2/ 2、放在这个文件夹下面 3、setting–>build–>Runner : -DarchetypeCataloglocal...

Android---java内存模型与线程

Java 内存模型翻译自 Java Memory Model,简称 JMM。它所描述的是多线程并发、CPU 缓存等方面的内容。 在每一个线程中,都会有一块内部的工作内存,这块内存保存了主内存共享数据的拷贝副本。但在 Java 线程中并不存在所谓的工作内存&#xff0…...

23.10.7.sql 里面的DISTINCT

例如: SELECT DISTINCT t.container_no FROM biz_inventory_task_detail t 这里distinct干嘛的 解释: DISTINCT是一个关键字,用于在SELECT语句中返回唯一不重复的值。 在这个查询中,使用DISTINCT关键字,是为了返回biz…...

mysql面试题38:count(1)、count(*) 与 count(列名) 的区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官: count(1)、count(*) 与 count(列名) 的区别 当使用COUNT函数进行数据统计时&…...

nodejs+vue+elementui大学生心理健康管理系统

简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术:nodejsvueelementui 前端:HTML5,CSS3、JavaScript、VUE本大学生心理健康管理系统使用简洁的框架结构,专门用于用户咨询心理专家,系统具有方便性、灵活性、应用性。于是…...

【MySQL】深入解析MySQL双写缓冲区

原创不易,注重版权。转载请注明原作者和原文链接 文章目录 为什么需要Doublewrite BufferDoublewrite Buffer原理Doublewrite Buffer和redo logDoublewrite Buffer相关参数总结 在数据库系统的世界中,保障数据的完整性和稳定性是至关重要的任务。为了实现…...

u-boot 编译与运行

文章目录 u-boot 编译与运行环境配置ubuntu 版本qemu 版本u-boot 版本(master)交叉工具链版本 u-boot 源码下载生成配置文件报错情况一报错情况2 u-boot 配置编译编译脚本编译报错解决编译日志编译产物 运行 u-boot 编译与运行 本文主要介绍 u-boot 编译…...

C++QT-day2

#include <bits/stdc.h>/*自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c;定义公有成员函数:初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h)输出该矩形的周长和面积函数:void sho…...

【Acwing187】导弹防御系统(LIS+剪枝+贪心+dfs+迭代加深)

题目描述 看本文需要准备的知识 1.最长上升子序列&#xff08;lis&#xff09;的算法思想和算法模板 2.acwing1010拦截导弹&#xff08;lis贪心&#xff09;题解 本题题解&#xff0c;需要知道这种贪心算法 3.简单了解dfs暴力搜索、剪枝、搜索树等概念 思路讲解 dfs求最…...

字节大佬带你五分钟掌握接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架怎么做&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。 特别是在…...

上传文件夹里面的文件后,按树结构的table表格展示

1. 先处理最简单的 原始数据大概是这样: let fileArr [{progress: 100,status: 成功,type: 通号,webkitRelativePath: "六捷数据2023-05-04 163909/G163/Abis口详细信息_(G163)(380BL3544-0)(14984173988)(2018-01-24 174431.0740—2018-01-24 180347.9070).xls"…...

【error】root - Exception during pool initialization

报错提示&#xff1a;root - Exception during pool initialization. 错误原因&#xff1a; 配置数据库出错 我的错误配置&#xff1a; spring.datasource.urljdbc:mysql://localhost:3306/springboot?serverTimezoneGMT spring.datasource.nameroot spring.datasource.pass…...

【重拾C语言】九、再论函数(指针、数组、结构体作参数;函数值返回指针、结构体;作用域)

目录 前言 九、再论函数 9.1 参数 9.1.1 参数的传递规则 9.1.2 指针作参数 9.1.3 数组作参数 9.1.4 结构体作参数 a. 直接用结构体变量作函数参数 b. 用指向结构体变量的指针作函数参数 9.2 函数值 9.2.1 返回指针值 9.2.2 返回结构体值 a. 返回结构体值 b. 返回…...

Spring WebClient 基于响应式编程模型的HTTP客户端

一、简介 WebClient是一个非阻塞的、可扩展的、基于Reactive Streams规范的HTTP客户端。它提供了一种简洁的方式来进行HTTP请求&#xff0c;并且可以很好地与其他Spring组件集成。WebClient支持同步和异步操作&#xff0c;使得它非常适合用于构建响应式应用程序。 WebClient允…...

IP真人识别方法与代理IP检测技术

随着互联网的发展&#xff0c;IP地址在网络安全和数据分析中扮演着重要的角色。为了维护网络的安全性和识别真实用户&#xff0c;IP地址的真实性和来源成为了一个关键问题。 什么是IP真人识别&#xff1f; IP真人识别是一种技术&#xff0c;旨在确定IP地址背后的用户是否为真实…...

MySQL 面试知识脑图 初高级知识点

脑图下载地址&#xff1a;https://mm.edrawsoft.cn/mobile-share/index.html?uuid18b10870122586-src&share_type1 sql_mode 基本语法及校验规则 ONLY_FULL_GROUP_BY 对于GROUP BY聚合操作&#xff0c;如果在SELECT中的列&#xff0c;没有在GROUP BY中出现&#xff…...

【数据结构】二叉树的链式结构及实现

目录 1. 前置说明 2. 二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 3. 节点个数及高度等 4. 二叉树的创建和销毁 1. 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二叉树结构…...

3分钟快速上手:Hanime1Plugin安卓插件打造纯净动画观影体验终极指南

3分钟快速上手&#xff1a;Hanime1Plugin安卓插件打造纯净动画观影体验终极指南 【免费下载链接】Hanime1Plugin Android插件(https://hanime1.me) (NSFW) 项目地址: https://gitcode.com/gh_mirrors/ha/Hanime1Plugin 你是否厌倦了动画观影时被各种广告弹窗打断&#x…...

ComfyUI Manager插件架构优化:5种高效部署方案与性能调优指南

ComfyUI Manager插件架构优化&#xff1a;5种高效部署方案与性能调优指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable variou…...

模型替换易,工作流锁定难!AI 锁定效应转移,企业决策何去何从?

模型替换易&#xff0c;工作流锁定难模型替换正变得越来越容易&#xff0c;但围绕模型的操作、集成和治理机制却难以更换。近日&#xff0c;普华永道&#xff08;PwC&#xff09;宣布为 3 万名员工提供有关 Anthropic 公司 Claude 模型的培训和认证&#xff0c;并围绕该模型为银…...

2026年AI辅助研发趋势:智能知识问答如何重塑企业知识库的未来?

在2026年的当下&#xff0c;大模型技术已经从最初的"聊天玩具"逐渐渗透到企业级研发的毛细血管中。作为深耕DevOps领域的架构师&#xff0c;我观察到一个显著的变化&#xff1a;企业知识库&#xff08;Knowledge Base&#xff09;正在从单纯的"文档存储中心&quo…...

Anthropic《创始人手册:打造AI原生创业公司》Claude(中文精读版)完整38页pdf

Anthropic 在2026年5月发布的官方手册&#xff0c;聚焦 AI 原生创业的全生命周期&#xff0c;拆解从创意、MVP、上线到扩张的四大核心阶段&#xff0c;重构 AI 时代的创业逻辑。 手册核心围绕 “AI 重塑创业模式” 展开&#xff0c;指出 2026 年 AI 已打破技术门槛&#xff0c;…...

告别黑白日志!用Xshell正则高亮集,让服务器报错、成功信息一目了然

告别黑白日志&#xff01;用Xshell正则高亮集&#xff0c;让服务器报错、成功信息一目了然 在运维和开发人员的日常工作中&#xff0c;与服务器打交道是家常便饭。无论是查看系统日志、调试应用程序&#xff0c;还是执行自动化脚本&#xff0c;我们都需要面对大量的命令行输出信…...

Phillips SDM01 0940860010091 003149电子控制单元

Phillips SDM01 0940860010091 003149 是一款飞利浦出品的电子控制单元&#xff0c;专用于工业设备或医疗系统的逻辑控制与信号处理。中间&#xff1a;15条产品特点SDM01 采用飞利浦高品质元器件&#xff0c;稳定性好。具备多路数字量输入输出通道&#xff0c;扩展性强。处理速…...

3步打造高效macOS菜单栏:Hidden Bar深度使用指南

3步打造高效macOS菜单栏&#xff1a;Hidden Bar深度使用指南 【免费下载链接】hidden An ultra-light MacOS utility that helps hide menu bar icons 项目地址: https://gitcode.com/gh_mirrors/hi/hidden 作为macOS用户&#xff0c;你是否曾为菜单栏图标拥挤不堪而烦恼…...

从缺页异常看Linux内存管理的基石:写时复制、延迟分配与交换机制

从缺页异常看Linux内存管理的基石&#xff1a;写时复制、延迟分配与交换机制 当你在Linux终端敲下./a.out时&#xff0c;内核如何将磁盘上的程序转化为内存中的鲜活进程&#xff1f;这个看似简单的过程背后&#xff0c;隐藏着一套精妙的内存管理机制。缺页异常&#xff08;Page…...

pip修改镜像源

pip临时使用pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple some-package注意&#xff0c;simple 不能少。 pip 要求使用 https &#xff0c;因此需要 https 而不是 http设为默认升级 pip 到最新的版本后进行配置&#xff1a;python -m pip install --u…...