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

2023-10-05 00:46

本文主要是介绍【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】虚化构造函数、虚化非成员函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/3045

相关文章

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.