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

객체 잘림 (Object Slicing)

  • 부모 클래스 자료형에 자식 클래스 자료형을 대입할 경우, 흔히 말하는 truncation이 발생한다.

예제

  #include <iostream>

  class Base
  {
  public:
    int    i_ = 0;

    virtual void print()
    {
      std::cout << "I'm Base\n";
    }
  };

  class Derived : public Base
  {
  public:
    int    j_ = 1;

    virtual void print() override
    {
      std::cout << "I'm Derived\n";
      std::cout << "j_ : " << j_ << '\n';
    }
  };

  void        doSomething1(Base& b)
  {
    b.print();
  }

  void        doSomething2(Base b)
  {
    b.print();
  }

  int            main()
  {
    using namespace std;

    Derived    d;
    Base&    b1 = d;
    Base    b2 = d;

    b1.print();
    b2.print();

    cout << endl;

    doSomething1(b1);
    doSomething2(b1);
  }

  /* stdout
  I'm Derived
  j_ : 1
  I'm Base

  I'm Derived
  j_ : 1
  I'm Base
  */
  • b1의 경우 레퍼런스로 전달하여 다형성이 적용된다.

  • b2의 경우 값을 복사한 것이므로 자식 클래스(Derived)가 아닌 부모 클래스(Base)로 인식한다.

    • 이 경우 다형성을 사용할 수 없다.

reference_wrapper

  • std::vector의 경우 템플릿에 레퍼런스를 넣을 수 없다.

    • 이럴 때 포인터로 구현을 해도 되지만, 레퍼런스로 구현하려면 reference_wrapper를 사용하면 된다.