C++原型模式

   原型模式实现方式

     原型模式的结构

  1. 抽象原型类:规定了具体原型对象必须实现的接口。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 clone() 方法来复制新的对象。
//父类
class Prototype {
protected:string prototype_name_;float prototype_field_;public:Prototype() {}Prototype(string prototype_name): prototype_name_(prototype_name) {//prototype_name_初始化为prototype_name}virtual ~Prototype() {}//析构函数virtual Prototype* Clone() const = 0;//纯虚函数,使用必须重写virtual void Method(float prototype_field) {//虚函数,允许被重写this->prototype_field_ = prototype_field;std::cout << "Call Method from " << prototype_name_ << " with field : " << prototype_field << std::endl;}
};//子类
class Realizetype1 : public Prototype {
private:float realize_prototype_field1_;//在父类的基础上添加的自己的东西public:Realizetype1(string prototype_name, float concrete_prototype_field)//有参构造函数: Prototype(prototype_name), realize_prototype_field1_(concrete_prototype_field) {}/*** 注意,Clone 方法返回一个新的克隆对象的指针,调用者必须释放其内存。*/Prototype* Clone() const override {return new Realizetype1(*this); }
};class Realizetype2 : public Prototype {
private:float realize_field2_;public:Realizetype2(string prototype_name, float concrete_prototype_field): Prototype(prototype_name), realize_field2_(concrete_prototype_field) {}Prototype* Clone() const override {return new Realizetype2(*this);}
};int main()
{Realizetype1  sxz("object1", 1000);Realizetype2  zbj("object2", 800);Realizetype1* s1 =(Realizetype1*) sxz.Clone();Realizetype2* z2 = (Realizetype2*)zbj.Clone();s1->Method(1000);z2->Method(800);delete []s1;delete[]z2;return 0;
}

问题1:强制类型转换有哪些使用条件

强制类型转换是一种将一种数据类型转换为另一种数据类型的操作,但是并不是所有类型之间都可以随意进行强制类型转换。在C++中,强制类型转换通常有以下几种形式:

  1. 静态转换(static_cast):用于基本类型之间的转换,以及具有继承关系的指针或引用之间的转换。
  2. 动态转换(dynamic_cast):用于具有继承关系的指针或引用之间的转换,会进行运行时类型检查。
  3. 常量转换(const_cast):用于去除常量属性。
  4. 重新解释转换(reinterpret_cast):用于不同类型之间的二进制位级别的转换。

虽然可以使用强制类型转换将一种类型转换为另一种类型,但是需要注意以下几点:

  1. 强制类型转换可能会造成数据丢失或精度损失。
  2. 强制类型转换可能会导致未定义的行为或不安全的操作。
  3. 在进行指针类型之间的转换时,需要确保类型之间是兼容的,否则可能会导致程序崩溃或内存泄漏等问题。

因此,虽然可以使用强制类型转换来实现某些特定的需求,但是需要谨慎使用,避免造成不可预测的后果。最好遵循类型安全原则,尽量避免使用强制类型转换。

问题2:原型模式叫法的由来 

 原型模式是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。这种方式可以提高对象的创建效率,并且可以避免直接使用构造函数来创建对象,从而减少对类的依赖。

原型模式的名称来源于生物学中的原型概念,即某个事物的原始模型或样本。在设计模式中,原型模式也类似地指代一个对象作为其他对象的原型,通过复制这个原型对象来创建新的对象。因此,原型模式得名于生物学中的原型概念,用以表示对象的复制和创建过程。

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

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

相关文章

单链表经典算法 面试题--力扣02.04

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a;创建新链表&#xff1a;大链表和小链表 将pcur节点小于x的值&#xff0c;尾插在小链表中 将pcur节点大于或等于x的值&#xff0c;尾插在大链表中 最终---- return lessHead->…

护眼 保护眼睛

高度近视600度的我&#xff0c;花了4个月时间度数降了50度&#xff0c;又花了一个多月的时间&#xff0c;双眼50度散光清零了。 然后就有人问我:散光都可以恢复吗&#xff1f; 我有点被问懵了&#xff0c;散光难道不容易恢复吗&#xff1f;直到我在网上查了一下&#xff0c;才发…

vue3和vite

vue3 1、vue3使如何实现效率提升的 客户端渲染效率比vue2提升了1.3~2倍 SSR渲染效率比vue2提升了2~3倍 1.1、静态提升 解释&#xff1a; 1. 对于静态节点&#xff08;如&#xff1a;<h1>接着奏乐接着舞</h1>&#xff09;&#xff0c;vue3直接提出来了&#xff…

whisper使用

whisper使用 1. 直接调用 语音识别2. 语种识别 whisper.detect_language()和whisper.decode()3. 指定要识别的语种做语音识别**whisper 源码的transcribe函数** 函数解析1. transcript.py2. tokenizer.py3. audio.py4. __ init__.py github: https://gitcode.com/openai/whispe…

vue基础+高级用法

一、vue基础用法 mvvm的了解/认知 语义化模板mvc - model view controllermvvm - model view view-model vue是如何利用mvvm思想进行开发 双向数据绑定 花括号&#xff0c;构建了数据与视图的双向绑定通过视图绑定事件&#xff0c;来处理数据 生命周期-vue示例 建立&…

【JAVA进阶篇教学】第十六篇:Java中AOP使用

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十五篇&#xff1a;Java中AOP使用。 AOP&#xff08;Aspect-Oriented Programming&#xff09;是一种编程范式&#xff0c;它允许开发者在不修改源代码的情况下&#xff0c;对代码进行横切关注点的分离和增强。在 Java…

CNAME记录

CNAME记录 维基百科&#xff0c;自由的百科全书 &#xff08;重定向自CNAME&#xff09; 真实名称记录&#xff08;英语&#xff1a;Canonical Name Record&#xff09;&#xff0c;即CNAME记录&#xff0c;是域名系统&#xff08;DNS&#xff09;的一种记录。CNAME记录用于…

mysqldump: Error 2013 导致mysql停止运行

https://www.cnblogs.com/DataArt/p/10173957.html 1 查询表大小 SELECT table_name AS "表名", round(((data_length index_length) / 1024 / 1024), 2) AS "大小(MB)" FROM information_schema.tables WHERE table_schema your_database_name AND …

Togaf培训简介

Togaf简单讲 1.定义事物&#xff0c;方便大家互相理解 2.做好现状和愿景设计 3.做好现状到愿景的计划 1.togaf 首先是统一语言。大家互相能理解&#xff0c;比如各种定义。 togaf源自美国军方理论 2.没有架构设计&#xff0c;烟囱式系统是必然的。 就跟之前去政府办户籍一…

抖店曝光率高,转化低,不知道怎么提升转化率?试试这四个方法

大家好&#xff0c;我是醒醒团队电商花花。 我们现在做抖音小店的商家或多或少都会遇到不出单&#xff0c;转化低的各种问题。 明明店铺的曝光不低&#xff0c;访客也不少&#xff0c;就是没转化。 下面我根据我们做店的经验&#xff0c;给大家分享一些问题所在&#xff0c;…

Git—安装及介绍

下载Git 官网地址&#xff1a;Git - Downloads (git-scm.com) 安装 双击安装包 点击 next 检查安装 桌面&#xff0c;右键鼠标&#xff0c;是否出现 Git GUI Here 和 Git Bash Here 打开Git Bash Here 输入命令 git --verison

NX/UG软件使用—策略OK回调环境变量

新建环境变量UGII_CAM_OPERATION_OK_EXIT&#xff0c;变量值为需要执行的xx.dll路径&#xff0c;设置后&#xff0c;重启NX&#xff0c;那么在每次点击策略OK之后&#xff0c;会自动执行xx.dll(注意这个dll需要在配置好的工具目录里&#xff0c;也就是说NX能手动加载这个dll)。…

finallyshell激活-支持所有版本(老版 + 最新版) + 所有平台(mac + windows)

一&#xff1a;打开finally shell的激活页面 二&#xff1a;点击离线激活 三&#xff1a;复制机器码&#xff0c;然后执行一下代码 原文&#xff1a;大哥原文&#xff0c;但是这个大佬是用java实现的&#xff0c;执行因为依赖的问题一直报错 基于以上问题&#xff0c;所以使…

YoLov9目标检测算法的使用

目录 一、环境安装 1、创建虚拟环境 2、安装依赖库 二、数据集准备 1、数据集的文件名 2、划分数据集 3、配置数据文件 4、修改模型结构文件的类别 5、下载模型预训练权重 三、训练 1、训练的三个文件介绍 2、训练 3、验证 4、检测单张图片 四、附录 1、训练参…

C#数据库密码加密保存和登录验证方法

目录 1. 使用哈希算法加密密码 2. 用户注册时加密密码并保存到数据库 3. 用户登录时验证密码 注意事项 如何实现加盐处理 安装BCrypt.Net包 密码哈希和验证 用户注册时加盐并哈希密码 用户登录时验证密码 1. 使用哈希算法加密密码 可以使用C#中的System.Security.Cryp…

01 区块链-- Smart Contract

Concept of Smart Contract 1. 智能合约并非区块链的专属 智能合约&#xff0c;就是一段部署在区块链里的代码。 合约有自己的地址&#xff0c;与该地址进行交易会触发代码运行&#xff0c;一旦某个事件触发合约中的条款&#xff0c;代码即自动执行。 也就是说&#xff0c;满…

上海市计算机学会竞赛平台2024年1月月赛丙组成绩等第

题目描述 给定一个在 00 到 100100 之间的整数 &#x1d44e;a&#xff0c;请将它转成等第&#xff0c;规则如下&#xff1a; 9090 或以上为 A8080 或以上为 B7070 或以上为 C6060 或以上为 D5959 或以下为 F 输入格式 单个数字表示 &#x1d44e;a 输出格式 单个字符表示…

c++快读快写

一般来讲&#xff0c;快读快写在针对数据量不是很大的输入输出的时候显得比较无力&#xff0c;但如果是多组数据或者输入量较多&#xff0c;就可以显著提升效率。 快读 一个一个字符读取比读入一个数字&#xff08;int&#xff09;快 inline int read(){int x 0, f 1;//in…

【前端】LayUI监听事件汇总

一、监听单选按钮事件 点击资源类型单选按钮时&#xff0c;请求后台接口&#xff0c;把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型&#xff1a;</label><d…