• Virtual Friend Function


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

    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 = 0;  // 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的,然后直接用它呢?

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

  • 相关阅读:
    Eclipse中支持js提示
    数据库命名规则
    JavaWeb 命名规则
    Ajax&json
    js中,var 修饰变量名和不修饰的区别
    javaScript知识点
    Bootstrap 栅格系统
    文本框如果不输入任何内容提交过后是一个空字符串还是null
    根据汇总数量依次扣减的SQL新语法
    asp.net中使用forms验证
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/5063211.html
Copyright © 2020-2023  润新知