在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板

例如:

//模板类,长方体类
template <typename ElementType>
class Rectangle
{///*重载基类的输入输出运算符*///template<typename ElementType>//friend std::istream& operator >> (std::istream& in, Rectangle<ElementType>& item);//template<typename ElementType>//friend std::ostream& operator << (std::ostream& out, const Rectangle<ElementType>& item);protected:        //受保护的成员ElementType length;        //长方体的长,在类内部可以直接使用模板定义的数据类型ElementType width;        //长方体的宽RectangleNo myNo;        //长方形的序号,嵌套类对象作为Rectangle类的一个数据成员

};

友元函数的定义部分也要加上template<typename T>这个模板

/*重载输入运算符*/
template <typename ElementType>
std::istream& operator >> (std::istream& in, Rectangle<ElementType>& item)
{in >> item.length >> item.width >> item.myNo.no;return in;
}/*重载输出运算符*/
template<typename ElementType>
std::ostream& operator << (std::ostream& out, const Rectangle<ElementType>& item)
{out << "length = " << item.length << " width = " << item.width << "    No = " << item.myNo.no;return out;
}

如果不知道怎么声明模板类的友元函数,可以在类内部用函数实现你想用友元函数实现的功能,

然后在类外的友元函数中调用这个类内函数,就可以达到相同的效果

例如:上面那个输入输出的友元函数可以改成:

//模板类,长方体类
template <typename ElementType>
class Rectangle
{
public://读取长方形void read(std::istream& in);//输出长方形void display(std::ostream& out)const ;
protected:        //受保护的成员ElementType length;        //长方体的长,在类内部可以直接使用模板定义的数据类型ElementType width;        //长方体的宽RectangleNo myNo;        //长方形的序号,嵌套类对象作为Rectangle类的一个数据成员
};

在类外实现read和display函数后,在类外的友元函数中调用这两个函数即可

template<typename ElementType>
void MyRectangle<ElementType>::read(std::istream& in)
{cout << "Please enter the length and width of " << myNo.no << endl;in >> length >> width;
}template<typename ElementType>
void MyRectangle<ElementType>::display(std::ostream& out) const
{out << "the " << myNo.no << " Rectangle's length =   " << length << " width = " << width;
}template<typename ElementType>
std::ostream& operator << (std::ostream& out, const Rectangle<ElementType>& item)
{item.display(out);return out;
}template<typename ElementType>
std::istream& operator >> (std::istream& in, Rectangle<ElementType>& item)
{item.read(in);return in;
}

派生类友元函数对基类的成员使用情况:

派生类友元函数可以使用基类中非private成员,可以使用基类的protected和public成员

基类的成员函数(包括友元函数)只能操作派生类对象中基类那部分。

如果派生类中有函数和基类同名,那么派生类对象会调用派生类中的那个函数,而不是对象的基类部分调用基类函数,派生类部分调用派生类函数。

转载于:https://www.cnblogs.com/hi3254014978/p/9809591.html

模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况相关推荐

  1. python怎么设置随机数种子_Pytorch在dataloader类中设置shuffle的随机数种子方式

    如题:Pytorch在DataLoader类中设置shuffle的随机数种子方式 虽然实验结果差别不大,但是有时候也悬殊两个百分点 想要复现实验结果 发现用到随机数的地方就是DataLoader类中封 ...

  2. c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解

    文章目录 静态多态.动态多态 虚函数 哪些函数类型不可以被定义成虚函数? 虚函数的访问方式 析构函数中的虚函数 虚函数表指针 vptr 多继承下的虚函数表 虚基类表指针 bptr 纯虚函数 抽象类 虚 ...

  3. 设计模板类,使得在创建一个对象时可以动态确定它的基类(public)

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class base_A { public: ...

  4. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public:void print(){cout<<"name:"<& ...

  5. python之抽象基类

    抽象基类特点 1.不能够实例化 2.在这个基础的类中设定一些抽象的方法,所有继承这个抽象基类的类必须覆盖这个抽象基类里面的方法 思考 既然python中有鸭子类型,为什么还要使用抽象基类? 一是我们在 ...

  6. 在保护继承中基类的共有成员_C++学习大纲:继承方式的调整

    C++ 继承方式的调整 在任何继承方式中,除了基类的private成员外,都可以在派生类中分别调整其访问控制. 调整格式 [public: | protected: | private: ] :: ; ...

  7. C++类与对象(类中的六大默认成员函数)

    文章目录 类的默认成员函数 构造函数 概念 特征 自己定义构造函数 类中编写 传参方法 编译器自动生成的构造函数 定义变量方式 初始化规则 析构函数 概念 特性 自己定义析构函数 编译器自动生成的析构 ...

  8. c++中的虚特性(虚基类、虚函数、纯虚函数)

    1. 虚基类 1.1 虚基类作用 为了解决多继承时的命名冲突和冗余数据问题,使得派生类中只保留一份间接基类的成员. 其本质是是让某个类做出声明,承诺愿意共享它的基类.其中,这个被共享的基类就称为虚基类 ...

  9. 第2章 包装外观(Wrapper Facade):用于在类中封装函数的结构型模式

    2.1 介绍 本论文描述包装外观模式.该模式的意图是通过面向对象( OO)类接口来封装低级函数和数据结构.常见的包装外观模式的例子是像 MFC. ACE和 AWT这样的类库,它们封装本地的 OS C ...

  10. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...

    如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 float 类型的区别: 你可能想知道同一内置运算符或函数如何对不同类对象进行不同操作的.这分别 ...

最新文章

  1. 英文文献中的一些单词
  2. UVA 10594 Data Flow
  3. 计算机视觉--Python实现人体姿态估计
  4. jquery一个控件绑定多个事件
  5. c php base64,C语言实现base64编码,base64解码
  6. 从五个维度来计算互联网产品单个用户的价值
  7. python3 week4
  8. CSS超过指定的宽度加省略号
  9. 约瑟夫环-单向循环链表
  10. 在业务控制方法中写入普通变量收集参数
  11. 三星老手机com.android,你认识几个?细数三星最经典的手机
  12. 稳压二极管型号对照表
  13. 模电——基本运算放大器原理
  14. ESX4 安装前的考虑
  15. Javaweb使用dom4j解析xml文档的一般姿势
  16. 使用python来进行用户流失预测的实战
  17. 怎么样成为java架构师_java架构师工资一般多少?怎样成为架构师?
  18. Android - Adapter 适配器
  19. 网络协议 7 - UDP 协议
  20. java 朴素贝叶斯_朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别?

热门文章

  1. View及ViewGroup的事件分发及传递(一)
  2. python中的选择结构语句是语句_python3控制语句---选择结构语句
  3. 动态内存分配---数组
  4. [node 工具] 用 Node.js 将 bugzilla 上的 bug 列表导入到 excel 表格在线版本之一(server 端)...
  5. JS数组去重的6种算法实现
  6. zTree中父节点禁用,子节点可以用
  7. C# ASP.NET里的@妙用,字符串换行
  8. pku 2954 Triangle pku 1265 Area Pick定理的应用 + 叉积求多边形面积
  9. 九种食物帮你赶走忧郁
  10. Android网络连接异常处理方案