Skip to content

2014 06 12 슬라이싱(slicing), 상속 방지 키워드: final

krikit edited this page Nov 26, 2014 · 1 revision

슬라이싱(slicing)

C++에서는 상속받은 자식 클래스의 객체를 부모 클래스의 포인터나 참조로 사용할 경우에만 polymorphism에 의한 virtual 메서드 오버라이딩이 일어납니다. 그냥 객체를 복사하는 경우에는 자식 클래스의 속성은 사라지고 완전히 부모 클래스가 되어 버리는데, 이러한 현상을 슬라이싱이라고 합니다. 즉, 메모리 상에서 구조체의 나머지 부분을 버리고 부모 클래스의 멤버들만 복사가 일어나게 되고, 이로 인해 메서드 오버라이딩이 제한되는 부작용이 발생합니다.

class Parent {
 public:
  virtual int get() { return 0; }
};

class Child : public Parent {
 public:
  virtual int get() { return 1; }
};

int main(int argc, char** argv) {
  Parent p;
  Child c;
  Parent* ptr = &c;
  ptr->get();    // 1
  Parent& ref = c;
  ref.get();    // 1
  Parent copy = c;
  copy.get();    // 0

  return 0;
}

상속 방지 키워드: final

C++11에서는 클래스 전체 혹은 메서드 별로 final 키워드를 이용해서 상속을 막는 방법이 생겼다고 합니다. 아래와 같이 클래스명 뒤나 메서드 선언 맨 뒤에 붙여주면 됩니다.

class LastHeritor final : public Parent {    // 클래스 전체 상속을 방지
 public:
  virtual int get();
  void put(int num) final;    // 메서드에 대해 상속에 의한 오버라이딩을 방지
};
Clone this wiki locally