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

【C++ techniques】虚化构造函数、虚化非成员函数

constructor的虚化

  • virtual function:完成“因类型而异”的行为;
  • constructor:明确类型时构造函数;
  • virtual constructor:视其获得的输入,可产生不同的类型对象。
//假如写一个软件,用来处理时事新闻,其内容由文字和图形构成class NTComponent{   //抽象基类,用于时事消息的组件
public:				 //其中至少含有一个纯虚函数...
};class TextBlock:public NTComponent{
public:...				//没有内含有任何纯虚函数
};	class Graphic : public NTComponent{
public:...				//没有内含有任何纯虚函数
};		class NewsLetter{	//一份时事通讯是有一系列的NTComponent对象构成
public:...
private:list<NTComponent*> components;
};	
//NewsLetter对象尚未开始运作的时候,可能存储于磁盘中
//让NewsLetter拥有一个constructor并用istream作为自变量
//这个constructor将从stream读取数据以便产生必要的核心数据结构:class NewsLetter{
public:NewsLetter(istream& str);...
};NewsLetter::NewsLetter(istream& str)
{while(str){read the next component object;add the object to the list of this newsletter's components;}
}
//如果将棘手的东西搬移到另一个名为readComponent的函数:class NewsLetter{
public:...
private:static NTComponent* readComponent(istream& str);...                                             
};NewsLetter::NewsLetter(istream& str)
{while(str){//将readComponent返回的指针加到component list尾端,//“push_back”是一个list member function,用来将对象安插//到list尾端components.push_back(readComponent(str));}
}

此时readComponent产生新对象,所以行为仿若constructor,但是它能够产生不同类型的对象,所以我们称之它为一个virtual constructor

virtual constructor:

  • 某种函数,视其获得的输入,可产生不同的类型对象;
  • 在许多情况下有用,比如从磁盘(或网盘或磁带等)读取对象信息。

virtual copy constructor:

  • 返回一个指针,指向其调用者(某对象)的一个新副本;
  • 基于这种行为,virtual copy constructors通常以copySelf或cloneSelf命名,或者像下面一样命令为clone。
class NLComponent{
public://声明 virtual copy constructorvirtual NLComponent* clone() const = 0;...
};class TextBlock:public NLComponent{
public:virtual TextBlock* clone() const //virtual copy constructor{return new TextBlock(*this);}...
};class Graphic:public NLComponent{
public:virtual Graphic* clone() const //virtual copy constructor{return new Graphic(*this);}...
};
class NewsLetter{
public:NewsLetter(const NewsLetter& rhs);...
private:list<NLComponent*> components;
};NewsLetter::NewsLetter(const NewsLetter& rhs)
{//迭代遍历rhs list,运用每个元素的virtual copy constructor,//将元素复制到对象的component list中。for(list<NLComponent*>::const_iterator it = rhs.components.begin();it != rhs.components.end(),++it){components.push_back((*it)->clone());}
}

non-member functions的虚化

写一个虚函数做实际工作,再写一个什么都不做的非虚函数,只负责调用虚函数;为了避免此巧妙安排蒙受函数调用所带来的成本,也可以将非虚函数inline化。

//为TextBlock和Graphic实现出output操作符class NLComponent{
public:virtual ostream& print(ostream& str) const = 0;
};class TextBlock:public NLComponent{
public:virtual ostream& print(ostream& str);
};class Graphic:public NLComponent{
public:virtual ostream& print(ostream& str);
};inline ostream& operator<<(ostream& s,const NLComponent& c)
{return c.print(s);
}

相关文章:

【C++ techniques】虚化构造函数、虚化非成员函数

constructor的虚化 virtual function&#xff1a;完成“因类型而异”的行为&#xff1b;constructor&#xff1a;明确类型时构造函数&#xff1b;virtual constructor&#xff1a;视其获得的输入&#xff0c;可产生不同的类型对象。 //假如写一个软件&#xff0c;用来处理时事…...

蓝牙核心规范(V5.4)11.6-LE Audio 笔记之初识音频位置和通道分配

专栏汇总网址:蓝牙篇之蓝牙核心规范学习笔记(V5.4)汇总_蓝牙核心规范中文版_心跳包的博客-CSDN博客 爬虫网站无德,任何非CSDN看到的这篇文章都是盗版网站,你也看不全。认准原始网址。!!! 音频位置 在以前的每个蓝牙音频规范中,只有一个蓝牙LE音频源和一个蓝牙LE音频接…...

mysql双主+双从集群连接模式

架构图&#xff1a; 详细内容参考&#xff1a; 结果展示&#xff1a; 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)...

嵌入式中如何用C语言操作sqlite3(07)

sqlite3编程接口非常多&#xff0c;对于初学者来说&#xff0c;我们暂时只需要掌握常用的几个函数&#xff0c;其他函数自然就知道如何使用了。 数据库 本篇假设数据库为my.db,有数据表student。 nonamescore4嵌入式开发爱好者89.0 创建表格语句如下&#xff1a; CREATE T…...

RandomForestClassifier 与 GradientBoostingClassifier 的区别

RandomForestClassifier&#xff08;随机森林分类器&#xff09;和GradientBoostingClassifier&#xff08;梯度提升分类器&#xff09;是两种常用的集成学习方法&#xff0c;它们之间的区别分以下几点。 1、基础算法 RandomForestClassifier&#xff1a;随机森林分类器是基于…...

计组——I/O方式

一、程序查询方式 CPU不断轮询检查I/O控制器中“状态寄存器”&#xff0c;检测到状态为“已完成”之后&#xff0c;再从数据寄存器取出输入数据。 过程&#xff1a; 1.CPU执行初始化程序&#xff0c;并预置传送参数&#xff1b;设置计数器、设置数据首地址。 2. 向I/O接口发…...

jsbridge实战2:Swift和h5的jsbridge通信

[[toc]] demo1: 文本通信 h5 -> app 思路&#xff1a; h5 全局属性上挂一个变量app 接收这个变量的内容关键API: navigation代理 navigationAction.request.url?.absoluteString // 这个变量挂载在 request 的 url 上 &#xff0c;在浏览器实际无法运行&#xff0c;因…...

集合原理简记

HashMap 无论在构造函数是否指定数组长度&#xff0c;进行的都是延迟初始化 构造函数作用&#xff1a; 阈值&#xff1a;threshold&#xff0c;每次<<1 &#xff0c;数组长度 负载因子 无参构造&#xff1a;设置默认的负载因子 有参&#xff1a;可以指定初始容量或…...

机器学习的超参数 、训练集、归纳偏好

一、介绍 超参数&#xff08;Hyperparameters&#xff09;和验证集&#xff08;Validation Set&#xff09;是机器学习中重要的概念&#xff0c;用于调整模型和评估其性能。 超参数&#xff1a; 超参数是在机器学习模型训练过程中需要手动设置的参数&#xff0c;而不是从数据…...

Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)

Leetcode1071. 字符串的最大公因子 对于字符串 s 和 t&#xff0c;只有在 s t … t&#xff08;t 自身连接 1 次或多次&#xff09;时&#xff0c;我们才认定 “t 能除尽 s”。 给定两个字符串 str1 和 str2 。返回 最长字符串 x&#xff0c;要求满足 x 能除尽 str1 且 x 能…...

如何像人类一样写HTML之图像标签,超链接标签与多媒体标签

文章目录 前言一、图像标签1.1 什么是图像标签&#xff1f;2.2 如何使用图像标签&#xff1f; 二、超链接标签2.1 什么是超链接标签&#xff1f;2.2 如何使用超链接标签&#xff1f; 三、多媒体标签3.1 什么是多媒体标签&#xff1f;3.2 如何使用多媒体audio标签&#xff1f;3.…...

1300*C. Rumor(并查集贪心)

解析&#xff1a; 并查集&#xff0c;求每个集合的最小费用。 每次合并集合的时候&#xff0c;根节点保存当前集合最小的费用。 #include<bits/stdc.h> using namespace std; #define int long long const int N1e55; int n,m,a[N],p[N],cnt[N]; int find(int x){retur…...

python实用小代码(数据分析向)

一、python实现31省市名称替换 首先定义了一个字典province_dict&#xff0c;其中包含每个省市的无缩写名称与其标准名称之间的映射。然后&#xff0c;我们使用map()函数将每个省市名称从无缩写名称转换为标准名称&#xff0c;并将结果存储在新列省市标准名称中。 province_di…...

【oncmdmsg 鼠标】2023/8/19 上午9:50:14

2023/8/19 上午9:50:14 oncmdmsg 鼠标 2023/8/19 上午9:50:22 抱歉,您提到的 “oncmdmsg” 和 “鼠标” 是什么?请提供更多上下文信息,我将尽力帮助您。 2023/8/19 上午9:51:43 OnCmdMsg 2023/8/19 上午9:52:21 “OnCmdMsg” 是一个在 MFC (Microsoft Foundation Cla…...

插入排序:简单而有效的排序方法

在计算机科学中&#xff0c;排序算法是一个重要且常见的主题&#xff0c;它们用于对数据进行有序排列。插入排序&#xff08;Insertion Sort&#xff09;是其中一个简单但有效的排序算法。本文将详细解释插入排序的原理和步骤&#xff0c;并提供Java语言的实现示例。 插入排序的…...

OpenGL之光照贴图

我们需要拓展之前的系统,引入漫反射和镜面光贴图(Map)。这允许我们对物体的漫反射分量和镜面光分量有着更精确的控制。 漫反射贴图 我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。我们仅仅是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我…...

隐私交易成新刚需,Unijoin 凭什么优势杀出重围?

随着区块链技术的普及和发展&#xff0c;全球加密货币用户在持续增长&#xff0c;根据火币研究院公布的数据&#xff0c;2022年全球加密用户已达到 3.2亿人&#xff0c;目前全球人口总数超过了 80亿&#xff0c;加密货币用户渗透率已达到了 4%。 尤其是在 2020 年开启的 DeFi 牛…...

小谈设计模式(12)—迪米特法则

小谈设计模式&#xff08;12&#xff09;—迪米特法则 专栏介绍专栏地址专栏介绍 迪米特法则核心思想这里的“朋友”指当前对象本身以参数形式传入当前对象的对象当前对象的成员变量直接引用的对象目标 Java程序实现程序分析 总结 专栏介绍 专栏地址 link 专栏介绍 主要对目…...

Foxit PDF

Foxit PDF 福昕PDF 软件&#xff0c;可以很好的编辑PDF文档。 调整&#xff30;&#xff24;&#xff26;页面大小 PDF文档中&#xff0c;一个页面大&#xff0c;一个页面小 面对这种情况,打开Foxit PDF 右键单击需要调整的页面,然后选择"调整页面大小". 可以选择…...

《Python趣味工具》——ppt的操作(刷题版)

前面我们对PPT进行了一定的操作&#xff0c;并将其中的文字提取到了word文档中。现在就让我们来刷几道题巩固巩固吧&#xff01; 文章目录 1. 查看PPT&#xff08;上&#xff09;2. 查看PPT&#xff08;中&#xff09;3. 查看PPT&#xff08;下&#xff09;4. PPT的页码5. 大学…...

实战型开发--3/3,clean code

编程的纯粹 hmmm&#xff0c;一开始在这个环节想聊一些具体的点&#xff0c;其实也就是《clean code》这本书中的点&#xff0c;但这个就还是更流于表面&#xff1b; 因为编码的过程&#xff0c;就更接近于运动员打球&#xff0c;艺术家绘画&#xff0c;棋手下棋的过程&#x…...

家用无线路由器如何用网线桥接解决有些房间无线信号覆盖不好的问题(低成本)

环境 光猫ZXHN F677V9 水星MW325R 无线百兆路由器 100M宽带&#xff0c;2.4G无线网络 苹果手机 安卓平板电脑 三室一厅94平 问题描述 家用无线路由器如何用网线桥接解决有些房间无线信号不好问题低成本解决&#xff0c;无线覆盖和漫游 主路由器用的运营商的光猫自带无…...

【Golang】网络编程

网络编程 网络模型介绍 OSI七层网络模型 在软件开发中我们使用最多的是上图中将互联网划分为五个分层的模型&#xff1a; 物理层数据链路层网络层传输层应用层 物理层 我们的电脑要与外界互联网通信&#xff0c;需要先把电脑连接网络&#xff0c;我们可以用双绞线、光纤、…...

使用策略模式优化多重if/else

一、为什么需要策略模式&#xff1f; 作为前端程序员&#xff0c;我们经常会遇到这样的场景&#xff0c;例如 进入一个营销活动页面&#xff0c;会根据后端下发的不同 type &#xff0c;前端页面展示不同的弹窗。 async getMainData() {try {const res await activityQuery()…...

逆强化学习

1.逆强化学习的理论框架 1.teacher的行为被定义成best 2.学习的网络有两个&#xff0c;actor和reward 3.每次迭代中通过比较actor与teacher的行为来更新reward function&#xff0c;基于新的reward function来更新actor使得actor获得的reward最大。 loss的设计相当于一个排序问…...

postgresql新特性之Merge

postgresql新特性之Merge 创建测试表测试案例 创建测试表 create table cps.public.test(id integer primary key,balance numeric,status varchar(1));测试案例 官网介绍 merge into test t using ( select 1 id,0 balance,Y status) s on(t.id s.id) -- 当匹配上了,statu…...

【注解】注解解析与应用场景

注解解析与应用场景 1.注解解析 注解解析就是判断类上、方法上、成员变量上是否存在注解&#xff0c;并把注解里的内容给解析出来 2.如何解析注解&#xff1f; 思想&#xff1a;要解析谁上面的注解&#xff0c;就应该先拿到谁&#xff08;通过反射&#xff09;如果要解析类…...

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…...

Linux驱动设备号分配与自动创建设备节点

Linux 驱动设备号 对于 Linux 系统&#xff0c;为了识别和管理设备&#xff0c;每个设备便使用一个唯一的编号来标记设备&#xff0c;每个注册到内核的设备都需要一个编号&#xff0c;这个编号就是设备号&#xff0c;为了细分设备号分为主设备号和次设备号。 由于 Linux 的设…...

基于MFC和OpenCV实现人脸识别

基于MFC和OpenCV实现人脸识别 文章目录 基于MFC和OpenCV实现人脸识别1. 项目说明1. 创建项目2. 启动窗口3. 登录窗口-添加窗口、从启动窗口跳转4. 启动窗口-美化按钮5. 登录窗口-美化按钮、雪花视频6. 注册窗口-美化按钮、雪花视频、从启动窗口跳转7. 注册窗口-开启摄像头8. 注…...

哪里找专业做网站的人常熟/找个免费的网站

2019独角兽企业重金招聘Python工程师标准>>> 1 集操作 定义&#xff1a;把多个sql的结果集&#xff0c;通过逻辑上的整合运算&#xff0c;拼在一起显示。 集操作缺省下都是按第一个查询的第一列升序排序&#xff0c;当然除了union all&#xff1a; …...

出入西安最新通知今天/快排seo排名软件

根据&#xff0c;我写的一篇文章《让程序产生bug&#xff0c;从而达到自我进化&#xff0c;是否能产生真正的智能生命&#xff0c;与人类沟通》的文章&#xff08;点击打开链接&#xff09;。我们在在超级计算机里&#xff0c;进化出智能程序&#xff0c;然后将智能程序转移到机…...

温州网站制作策划/百度信息流广告推广

错误和异常的区别(Error vs Exception)参考文章&#xff1a; &#xff08;1&#xff09;错误和异常的区别(Error vs Exception) &#xff08;2&#xff09;https://www.cnblogs.com/with-wang/archive/2012/03/24/java_doc_3.html 备忘一下。...

免费psd素材网/成都纯手工seo

咳咳&#xff01;先打一波小广告&#xff0c;在上一篇里忘记了&#xff0c;那啥……我的那个个人博客做好了-->(我的博客)<--。嘿嘿 好嘞&#xff0c;言归正传&#xff0c;说说我们的效果。 其实就是实现横向滑动&#xff0c;进行选择。 原理&#xff1a; 鼠标按下&#…...

宁波企业网站制作/google中文搜索引擎

(点击上方公众号&#xff0c;可快速关注)来源&#xff1a;Float_Luuu&#xff0c;my.oschina.net/andylucc/blog/539783今天查了很多资料&#xff0c;主要是想搞清楚写JAVA和CacheLine有什么关系以及我们如何针对CacheLine写出更好的JAVA程序。CPU和内存CPU是计算机的大脑&…...

wordpress前台登陆插件/搜索指数查询

语义分割网络对图像中的每个像素进行分类&#xff0c;从而对图像进行分割。语义分割的应用包括用于自动驾驶的道路分割和用于医疗诊断的癌细胞分割。本文展示了如何使用 MATLAB 训练语义分割网络 Deeplab v3&#xff0c;实现了自动驾驶场景下的全景分割。 本例使用剑桥大学的C…...