首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ I/O流重载:如何实现友元重载,对于同一标头中相同的4个i/o函数的3个不同的类?

C++ I/O流重载是指在C++中对输入输出流进行重载操作,以实现对不同类型数据的输入输出。友元重载是指在类的定义中,将其他类或函数声明为友元,使其可以访问该类的私有成员。

对于同一标头中相同的4个I/O函数的3个不同的类,可以通过以下步骤实现友元重载:

  1. 首先,在标头文件中定义一个基类,该基类包含4个I/O函数的声明,如下所示:
代码语言:cpp
复制
class Base {
public:
    friend ostream& operator<<(ostream& os, const Base& obj);
    friend istream& operator>>(istream& is, Base& obj);
    friend ofstream& operator<<(ofstream& ofs, const Base& obj);
    friend ifstream& operator>>(ifstream& ifs, Base& obj);
};
  1. 然后,定义3个不同的派生类,每个派生类都重载了基类中的4个I/O函数,如下所示:
代码语言:cpp
复制
class Derived1 : public Base {
public:
    friend ostream& operator<<(ostream& os, const Derived1& obj);
    friend istream& operator>>(istream& is, Derived1& obj);
    friend ofstream& operator<<(ofstream& ofs, const Derived1& obj);
};

class Derived2 : public Base {
public:
    friend ostream& operator<<(ostream& os, const Derived2& obj);
    friend istream& operator>>(istream& is, Derived2& obj);
    friend ifstream& operator>>(ifstream& ifs, Derived2& obj);
};

class Derived3 : public Base {
public:
    friend ostream& operator<<(ostream& os, const Derived3& obj);
    friend ofstream& operator<<(ofstream& ofs, const Derived3& obj);
    friend ifstream& operator>>(ifstream& ifs, Derived3& obj);
};
  1. 在每个派生类的实现文件中,实现对应的重载函数,例如:
代码语言:cpp
复制
ostream& operator<<(ostream& os, const Derived1& obj) {
    // 实现输出操作
    return os;
}

istream& operator>>(istream& is, Derived1& obj) {
    // 实现输入操作
    return is;
}

// 其他函数的实现类似

通过以上步骤,我们可以实现对同一标头中相同的4个I/O函数的3个不同的类的友元重载。在实际使用中,可以根据具体需求进行调用和操作。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,建议参考腾讯云官方文档或咨询腾讯云的技术支持团队,获取与C++ I/O流重载相关的产品和服务信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】泛型编程 ⑨ ( 模板运算符重载 - 函数声明 和 函数实现 写在同一中 | 模板 外部函数问题 )

模板 函数声明 与 函数实现 都写在同一中 ; 模板 函数实现外部进行 , 写在相同 .h 和 .cpp 源码文件中 ; 模板 函数实现外部进行 , 写在不同...使用域作用符 Father:: 访问函数 ; 3、函数声明与函数实现分离 + 函数引入 如果要在 模板 中进行运算符重载 , 就需要用到函数 ; 如果将 模板 函数实现 , 定义在函数外部..., 结合 函数 使用 , 就变得很复杂 , 下面针对该问题进行讨论 ; 二、普通运算符重载 - 函数声明 和 函数实现 写在同一中 下面的是一个 普通 , 其中定义了 成员变量 和 成员方法...; 并为其重载了 左移运算符 和 加法运算符 ; 其中 加法运算符 重载 是在 内部实现 , 左移运算符 重载 是在外部 通过函数实现 , 因为左移运算符 左操作数是 ostream&...三、模板运算符重载 - 函数声明 和 函数实现 写在同一中 1、模板 外部函数问题 将上述 " 普通运算符重载 - 函数声明 和 函数实现 写在同一中 " 示例改造成 模板

20210

C++】泛型编程 ⑩ ( 模板运算符重载 - 函数实现 写在外部同一个 cpp 代码中 | 模板 外部函数二次编译问题 )

模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 : 模板 函数声明 与 函数实现 都写在同一中 , 也就是没有分开进行编码 ; 模板 函数实现外部进行 ,...函数声明 和 实现 写在相同 .cpp 源码文件中 ; 模板 函数实现外部进行 , 函数声明 和 实现 写在不同 .h 和 .cpp 源码文件中 ; 上一篇博客 【C++】泛型编程 ⑨...( 模板运算符重载 - 函数声明 和 函数实现 写在同一中 | 模板 外部函数问题 ) 实现了第一种情况 , 模板 函数声明 与 函数实现 都写在同一中 , 也就是没有分开进行编码...; 本篇博客 , 开始分析 第二种情况 , 模板 函数实现外部进行 , 写在相同 .h 和 .cpp 源码文件中 ; 一、模板 - 函数声明与函数实现分离 1、模板 外部 实现 构造函数...外部 实现 函数 函数 不是 函数 , 是 外部函数 , 函数 中又用到了 泛型 T , 说明这是一个 模板函数 ; 函数 是 全局函数 , 不属于 模板 , 不要使用 域操作符

16310

C++输入输出操作符重载

3.重载形式 对输出操作<<进行重载,只能采用友函数形式进行,而不能将operator<<()申明为ostream成员函数。...所以,要将someClass对象输出到标准输出对象,只能采用将operator<<()重载为全局函数,申明为someClass形式进行。...这种函数重载,既安全又高效。 对于输入操作符>>进行重载,也是能采用友函数形式进行,而不能讲operator>>()申明为istream成员函数。...所以,要从标准输入对象将数据读入someClass对象中,只能采用operator>>()重载为全局函数,且申明为someClass形式。...(1)对于输入输出操作符进行重载,只能采用友函数形式,而不能采用成员函数形式,原因前面已经讲述。

68420

C++:12---运算符重载

一、概念 对已有的运算符重新进行定义,赋予其另一种功能,以适应不同数据类型 重载运算符是具有特殊名字函数,该函数也有返回值、参数列表、函数体 二、运算符重载3种实现方式 成员函数:私有、公有、...保护都可以 函数:同上 全局函数:只能访问公有的 三、运算符重载规则 C++98,C++0x,C++11对“哪些运算符重载能够重载”有一致规定。...输入输出运算符重载不能用成员函数实现,一般用友实现 重载输出运算符<< 参数: 参数1:一个非常量ostream对象引用(ostream是非常量是因为向写入内容会改变其状态) 参数2:一般来说是一个常量引用...重载该运算符用于增强操作 C++ 数组功能。 下面的实例演示了如何重载下标运算符 []。...同样地,下面的实例演示了如何重载成员访问运算符 ->。

58030

C++基础(五).多态

重写中被重写函数必须有virtual修饰 重载和重写区别 范围区别:重写和被重写函数不同中,重载和被重载函数同一中 参数区别:重写与被重写函数参数列表一定相同重载和被重载函数参数列表一定不同...:隐藏函数和被隐藏函数参数列表可以相同,也可以不同,但函数名一定同;当参数不同时,无论基函数是否被virtual修饰,基函数都是被隐藏,而不是被重写 Tip: 引自 C++重载、重写(覆盖)和隐藏区别...作用在于提高程式运行效率,但是,他破坏了封装性和隐藏性,使得非成员函数能够访问私有成员 能够是个函数,该函数被称为函数也能够是个,该类被称为 函数 函数特点是能够访问私有成员非成员函数...函数从语法上看,他和普通函数相同,即在定义上和调用上和普通函数相同 除了前面讲过函数以外,还能够是,即一个能够作另一个。...当一个作为另一个时,这就意味着这个任何成员函数都是另一个函数 Tip: 引自 C++中友详解 ---- 代码示例 要求 用友函数实现clock前置、后置单目运算符重载

63120

C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

这意味着,在同一作用域内,只要函数参数类型不同,或者参数个数不同,或者二者兼而有之,两个或者两个以上函数可以使用相同函数名。...与一般数据成员不同,无论建立多少个对象,都只有一个静态数据成员拷贝。从而实现同一不同对象之间数据共享。...函数提供了不同成员函数之间、成员函数与一般函数之间进行数据共享机制。...~ 7.1 运算符重载概述 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型数据导致不同行为。...~ 用于输入/输出头文件 C++编译系统提供了用于输入/输出I/O库。

3.1K40

C++从入门到精通——6个默认成员函数之赋值运算符重载

三、前置++和后置++重载 示例 概念 四、深挖operator 函数 模拟实现 函数 前言 6个默认成员函数:如果一个中什么成员都没有,简称为空。...函数重载是指在同一个作用域中定义多个具有相同名称但参数列表不同函数。这样做目的是为了提供更灵活函数调用方式,使得同一函数名可以根据不同参数类型或参数个数执行不同操作。...函数重载用于定义同一功能不同实现,而运算符重载用于为自定义创建与内置类型相似的运算符行为。..._day<<"日"<<endl; } 以此类推,输入也是同理 函数 函数是指在定义中,声明为函数可以直接访问该类私有成员和保护成员。...函数可以是全局函数,也可以是其他成员函数。在C++中,使用关键字friend来声明函数函数定义通常在外部。

10210

C++笔记:运算符重载

C++笔记:运算符重载 引言 函数重载就是对一个已有的函数赋予新含义,使之实现新功能,做到“一名多用”。 运算符也可以重载,在C++标准库中也使用了大量运算符重载。...例如: << 既是左移运算符,又是输出运算符。 >> 既是右移运算符,又是输入运算符。 + 能实现int、float、double类型不同运算。...同样,可对“+”运算符进行重载实现两个对象加法运算。 运算符重载 运算符重载是通过定义函数实现,这种函数称为运算符重载函数,它通常是成员函数或者函数。...) 运算符重载和方法 成员函数作为运算符重载函数 函数作为运算符重载函数 class Complex //复数 { public: //使用成员函数重载运算符+ Complex...在头文件 iostream.h 中已经对 > 进行了重载,使之作为输入运算符和输出运算符。 输入/输出运算符只能重载函数

94320

运算符重载

运算符重载 函数 函数是定义在外部,但有权访问所有私有(private)成员和保护(protected)成员。...尽管函数原型有在定义中出现过,但是函数并不是成员函数。...若B是A。则只有B成员函数可以访问A中隐藏信息 是单向,不具有交换性。 若B是AA不一定是B,要看在中是否有相应声明。 关系不具有传递性。...操作符>>,<<重载 cout是输出对象,而cin是输入对象,C++头文件iostream取自istream和ostream之意 操作符>>,<<一般使用非成员函数实现,也就是函数实现...);//IO运算符重载函数一般声明为函数 #if IS_MENBER istream &operator>>(istream &is); //成员函数重载>>提取运算符

92160

c++学习路线

C++语言 面向对象编程思想; 封装,构造和析构、静态成员、对象管理; 构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构; 对象动态管理、函数、操作符重载C++编译器对象管理模型分析...; 对象动态管理(new/delete); 函数; 运算符重载(一运算符、二运算符、运算符重载难点、项目开发中运算符重载); 继承、多继承及其二义性、虚继承; 多态(概念、意义...、原理剖析、多态案例); 虚函数、纯虚函数、抽象(面向抽象编程思想案例); 函数模板、模板,模板继承; C++类型转换; C++输入输出(标准I/O 文件I/O 字符I/O); C++异常处理...通过学习此阶段,应掌握泛型编程技巧,理解容器C++语言中应用模式,以及熟练掌握全部STL使用方法。...,linux,ios,android不同平台下移植技术。

65420

CC++学习路线

既然如此,C/C++开发到底需要学些什么呢,又应该怎么学呢?接下来由黑马程序员C/C++学院教你如何从零基础学习C/C++开发,快速进入牛人之列,掌握这门贵族语言。...② C++语言 面向对象编程思想; 封装,构造和析构、静态成员、对象管理; 构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构; 对象动态管理、函数、操作符重载C++编译器对象管理模型分析...; 对象动态管理(new/delete); 函数; 运算符重载(一运算符、二运算符、运算符重载难点、项目开发中运算符重载); 继承、多继承及其二义性、虚继承; 多态(概念、意义...、原理剖析、多态案例); 虚函数、纯虚函数、抽象(面向抽象编程思想案例); 函数模板、模板,模板继承; C++类型转换; C++输入输出(标准I/O 文件I/O 字符I/O); C++异常处理...,linux,ios,android不同平台下移植技术。

79520

Google C++ 编程风格指南(五):其他 C++ 特性

缺点: 如果函数单单靠不同参数类型而重载(acgtyrant 注:这意味着参数数量不变),读者就得十分熟悉 C++ 五花八门匹配规则,以了解匹配过程具体到底如何。...通常应该定义在同一文件内, 避免代码读者跑到其它文件查找使用该私有成员....某些情况下, 将一个单元测试声明成待测会很方便. 扩大了 (但没有打破) 封装边界....就因为这一点我们反对使用操作符重载. 有人说 printf 格式化丑陋不堪, 易读性差, 但也好不到哪儿去. 看看下面两段代码吧, 实现相同功能, 哪个更清晰?...本风格指南都强调了「应该定义在同一文件内,避免代码读者跑到其它文件查找使用该私有成员」。那么可以把其声明放在声明所在头文件,定义也放在定义所在文件。

1.1K30

C++函数模板(模板函数)详解

有时,有两个或多个,其功能是相同,仅仅是数据类型不同,如下面语句声明了一个模板用于实现所需数据类型参数化 模板在表示如数组、表、图等数据结构显得特别重要, 这些数据结构表示和算法不受所包含元素类型影响...&out, Complex &c3) ; 函数函数不是实现函数重载(非 >) 1 需要在前增加 前置声明 函数前置声明 template class...必须写成 Complex c4 = mySub(c1, c2); cout<<c4; 结论:函数只用来进行 左移 移操作符重载。...,在不同.h和.cpp中 也就是模板函数说明和模板实现分开 //模板函数 构造函数 普通成员函数 函数 用友函数重载>; 用友函数重载非> demo_complex.cpp...由于模板二次编译原理再加上static关键字修饰成员,当它们在一起时候实际上一个模板会被编译成多个具体类型,所以,不同类型模板对应static成员也是不同不同),但相同类型模板

1.3K40

C++查缺补漏

return 0; } C++提供一种破坏数据封装和数据隐藏机制 通过将一个模块声明为另一个模块,一个模块能够引用到另一个模块中本是被隐藏信息 为了确保数据完整性...friend修饰说明 关系是单向 如果声明B是A,B成员函数就可以访问A私有和保护数据,但A成员函数却不能访问B私有、保护数据 常类型 对于既需要共享、又需要防止改变数据应该声明为常类型...,它与 private 成员性质相同 对于其派生来说,它与 public 成员性质相同实现了数据隐藏,又方便继承,实现代码重用 class A{ public: void setA(int...将有关数据和行为组织在一个继承层次结构中,保证派生具有要求行为 对于暂时无法实现函数,可以声明为纯虚函数,留给派生实现 注意: 抽象只能作为基来使用。...两个重要输入/输出 一个iostream对象可以是数据源或目的 两个重要I/O都是从iostream派生,它们是fstream和stringstream。

2.5K10

C++C++ IO

如下图所示: 对输入输出缓冲区理解: 缓冲区存在可以屏蔽掉低级I/O实现;由于低级I/O实现依赖操作系统本身内核实现,所以如果能够屏蔽这部分差异,就可以很容易写出可移植程序。...为了实现这种流动,C++定义了I/O标准库,这些每个都称为/,用以完成某方面的功能。...---- 三、C++ IO C++系统实现了一个庞大 I/O 标准库,其中ios为基,其他都是直接或间接派生自ios: 1、C++ 标准 IO C++标准库提供了4个全局对象cin...从 I/O 标准继承体系图中可以看出,cout、cerr、clog 是 ostream 三个不同对象,因此这三个对象基本没有区别,只是应用场景不同而已。...需要注意是,自定义类型在重载插入和提取运算符时,需要先将 operator> 声明为函数,然后再在外对函数进行定义,至于原因我们在 和对象下篇 中有详细介绍

27330

C++面向对象程序设计

---- 3.3.1 函数重载概述 ---- 作用:函数名可以相同,提高复用性 函数重载满足条件: 同一个作用域下 函数名称相同 函数参数类型不同 或者 个数不同 或者 顺序不同 注意: 函数返回值不可以作为函数重载条件...构造函数语法:名(){} 构造函数,没有返回值也不写void 函数名称与相同 构造函数可以有参数,因此可以发生重载 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次 析构函数语法:...---- C++中成员变量和成员函数是分开存储,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己呢?...在程序里,有些私有属性 也想让外特殊一些函数或者进行访问,就需要用到技术 目的就是让一个函数或者 访问另一个中私有成员 关键字为 :friend 三种实现...全局函数 成员函数 ---- 4.4.1 全局函数 示例 #include #include #include

37750

C++面向对象程序设计

---- 3.3.1 函数重载概述 ---- 作用:函数名可以相同,提高复用性 函数重载满足条件: 同一个作用域下 函数名称相同 函数参数类型不同 或者 个数不同 或者 顺序不同 注意: 函数返回值不可以作为函数重载条件...构造函数语法:名(){} 构造函数,没有返回值也不写void 函数名称与相同 构造函数可以有参数,因此可以发生重载 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次 析构函数语法:...---- C++中成员变量和成员函数是分开存储,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己呢?...在程序里,有些私有属性 也想让外特殊一些函数或者进行访问,就需要用到技术 目的就是让一个函数或者 访问另一个中私有成员 关键字为 :friend 三种实现...全局函数 成员函数 ---- 4.4.1 全局函数 示例 #include #include #include

1.2K10

CC++学习路线

既然如此,C/C++开发到底需要学些什么呢,又应该怎么学呢?接下来由黑马程序员C/C++学院教你如何从零基础学习C/C++开发,快速进入牛人之列,掌握这门贵族语言。...② C++语言 面向对象编程思想; 封装,构造和析构、静态成员、对象管理; 构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构; 对象动态管理、函数、操作符重载C++编译器对象管理模型分析...; 对象动态管理(new/delete); 函数; 运算符重载(一运算符、二运算符、运算符重载难点、项目开发中运算符重载); 继承、多继承及其二义性、虚继承; 多态(概念、意义...、原理剖析、多态案例); 虚函数、纯虚函数、抽象(面向抽象编程思想案例); 函数模板、模板,模板继承; C++类型转换; C++输入输出(标准I/O 文件I/O 字符I/O); C++异常处理...,linux,ios,android不同平台下移植技术。

48140

干货 | 学习算法,数据魔术师告诉你需要掌握这些编程基础(包含JAVA和C++

然后是C++部分:面向对象编程思想;封装,构造和析构、静态成员、对象管理;构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;对象动态管理、函数、操作符重载对象动态管理...(new/delete);函数;运算符重载继承、多继承及其二义性、虚继承;多态;虚函数、纯虚函数、抽象(面向抽象编程思想案例);函数模板、模板,模板继承; C++类型转换;C+...+输入输出(标准I/O 文件I/O 字符I/O);C++异常处理(异常机制、异常类型、异常变量、异常层次结构、标准异常库)。...小编之所以建议两手抓,是因为C++和java都有着非常显著优点。 对于C++而言,速度相当快,快到你怀疑人生。可能此时会有读者有疑问,小编骗人,有时候明明感觉C++离谱。...对于java而言,最大优点是兼顾速度和易用性。速度总体上和C++是一个量级,但终究还是比不过变态C++

1.1K21
领券