C++/Class 2021. 3. 21. 23:56

유도 클래스에서 출력 연산자 사용하기

  • 연산자 오버로딩할 때만 사용하는게 아니라, 다형성을 더 유연하게 구현할 때도 사용되는 기법이다.

예제

  • 멤버 함수로 만들 수 없는 연산자를 오버라이딩한 것 처럼 구현하기 위해서 다음과 같은 기법을 사용할 수 있다.

    #include <iostream>
    
    class Base
    {
    public:
      friend std::ostream& operator << (std::ostream& out, const Base& b)
      {
        return b.print(out);
      }
    
      virtual std::ostream& print(std::ostream& out) const
      {
        out << "Base";
        return out;
      }
    };
    
    class Derived : public Base
    {
    public:    
      virtual std::ostream& print(std::ostream& out) const override
      {
        out << "Derived";
        return out;
      }
    };
    
    int            main()
    {
      using namespace std;
    
      Base b;
      cout << b << '\n';
    
      Derived d;
      cout << d << '\n';
    
      Base& bref = d;
      cout << bref << '\n';
    }
    
    /* stdout
    Base
    Derived
    Derived
    */