首页
学习
活动
专区
工具
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、类模板 的 外部友元函数问题 将上述 " 普通类的运算符重载 - 函数声明 和 函数实现 写在同一个类中 " 示例改造成 类模板

27310

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

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

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

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

    73520

    00后小哥哥,浅谈C++输入输出流及其重载

    浅谈 C++输入输出流及其重载 在学习 C 阶段我们写代码第一句就是#include,这个到底是什么呢?...但是我们在使用 C++的时候,我们不需要关心指定的输入数据类型,这得益于在 C++的(I/O stream)中,对于>>和重载。...重载机制是 C++相对于 C 的很大一个改进,我们不需要想不同的名字来实现类似功能,并且我们可以通过重载>>和实现用户自定义的输入输出。...os << "date.month:"<<date.month << "date.day"<<date.day << "date.year"<<date.year; return os; } 为什么重载为这个类的友元函数...友元问题可以看博客https://blog.csdn.net/flf1234567898/article/details/104824230 重载之后我们就可以直接 cout << dt; 再来看>>的重载

    58320

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

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

    59930

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

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

    3.4K40

    C++基础(五).多态

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

    66120

    C++ 上篇

    1.语言中的数据成分 2.语言中的运算成分 3.语言中的控制成分 4.语言中的传输成分 函数的传参机制 C++中的数据类型     1.该类型的所占内存大小     2.基于该类型的运算方法...,如果不一致编译器会将其转换同一类型,运算后也是该类型     2.编译器隐式转换规则         a.整形转浮点         b.小的转大的         c.有符号转无符号 赋值运算...函数的重载     函数名相同,形参类型不同,这样的函数形成重载     函数名相同,形参个数不同,这样的函数形成重载     函数名相同,返回值类型不同,这样的函数不能形成重载 回顾:    ...类 和对象     构造函数         没有返回值         函数名跟类名一致         可以重载         如果用户没有自定义一个拷贝构造函数,         编译器会准备一个默认的拷贝构造函数...指针,不能操作普通成员变量     友元         友元函数         友元类 ===================================================

    5910

    C++笔记:运算符重载

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

    1.4K20

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

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

    13710

    c++学习路线

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

    67620

    运算符重载

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

    94860

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

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

    1.2K30

    CC++学习路线

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

    84420

    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.6K10

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

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

    1.8K40

    九、运算符重载

    作为友元函数重载: 适用于需要访问类的私有或受保护成员,或者当运算符的两个操作数都是用户定义类型时。友元函数不是类的成员函数,但可以被授予访问类私有成员的权限。...语法 C++中的运算符重载允许程序员为已存在的运算符赋予新的意义,以便它们能够用于自定义类型(如类、结构体等)之间的操作。运算符重载可以通过成员函数或友元函数来实现。...如何重载算术运算符 要重载算术运算符,你需要在类内部或外部(通过友元函数)定义一个特殊的成员函数或非成员函数,这个函数以关键字operator后跟你想要重载的运算符名称命名。...友元函数:有时,为了允许访问类的私有或受保护成员,你可能需要将重载的运算符函数声明为类的友元。...重载插入运算符(operator<<) 插入运算符的内容输出到流中,比如打印到控制台。这个运算符通常作为非成员函数重载,并声明为类的友元,以便它能够访问类的私有和保护成员。

    16210

    C++面向对象程序设计

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

    41250

    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不同平台下的移植技术。

    52740
    领券