一般而言,友元作为一种紧耦合的设计,被视作类的一部分。一个经典的应用就是关于类的序列化和反序列化。

class A
{
friend ostream& operator<<(ostream& os, const A& a);
private:
int i;
} ostream& operator<<(ostream& os, const A& a)
{
return os << a.i;
}

问题是当在一个继承结构里面,每个类都需要这么一个序列化(反序列化)过程的时候,每次重新写一个友元函数实在是繁琐。

但是友元函数又不是类的成员函数,不能定义成虚函数。于是在C++提供了这样一种语法支持:在友元函数里面调用虚函数,使得

它能够呈现出多态特性:

    class Base {
public:
friend std::ostream& operator<< (std::ostream& o, const Base& b);
// ...
protected:
virtual void printOn(std::ostream& o) const = ; // Or plain virtual; see below
};
inline std::ostream& operator<< (std::ostream& o, const Base& b)
{
b.printOn(o);
return o;
}
class Derived : public Base {
public:
// ...
protected:
virtual void printOn(std::ostream& o) const;
};
void Derived::printOn(std::ostream& o) const
{
// ...
}

这样,我们只要重载成员函数printOn,就能直接使得我们定义的派生类具备了序列化(反序列化)的能力。

问题是这里为什么不直接将printOn定义成public的,然后直接用它呢?

我能理解出的一个优点就是统一性,所有类都去定义这样的序列化操作符,比起各自设计不同的成员函数要强。

最新文章

  1. 开放地址法实现HashTable
  2. 设计模式原来如此-代理模式(Proxy Pattern)
  3. JavaScript DOM高级程序设计 5动态修改样式和层叠样式表1(源代码)--我要坚持到底!
  4. Java Stream 使用详解
  5. C语言中两个相等的char值比较 结果为false
  6. php 简易验证码(GD库)
  7. Simple 杂题练手记
  8. 行为驱动开发BDD和Cucunber简介
  9. C++-int类型整数超出范围后的处理
  10. CSS 实现左侧固定,右侧自适应两栏布局的方法
  11. Go基础系列:构建go程序
  12. laravel 不理解的call方法
  13. golang IO 流抽象与应用
  14. 关于 TypeReference 的解释
  15. 2016NOI冬令营day0
  16. react篇章-React Props
  17. [HTML5] Using the focus event to improve navigation accessibility (nextElementSibling)
  18. 解决LLDB模式下出现message sent to deallocated instance错误
  19. SSH框架——(二)四层结构:DAO,Service,Controller,View层
  20. Protobuf-net 应用

热门文章

  1. php Composer 报ssl证书错误
  2. HTML5自学笔记[ 3 ]表单验证反馈
  3. 小例子(三)、winform控件的移动
  4. 20150206读书笔记&lt;深入理解计算机系统&gt;
  5. 百度地图API:利用瓦片生成工具,自定义背景图片
  6. chrome 模拟点击
  7. 454. 4Sum II ——查找本质:hash最快,二分次之
  8. placeholder在ie789下无效
  9. MyEclipse生成WAR包并在Tomcat下部署发布[转]
  10. outlook 用宏发邮件