혹시 순수 가상 함수를 사용 해본적이 있는가? 그렇다면 어떤 함수를 순수 가상함수로 만들어서 사용 했는가? 이 번 항목에선 이런 질문들을 정리하기 위한 항목이라 봐도 좋을 듯 싶다.


질문 1. 순수 가상 함수는 무엇인가? 예를 들어라.


질문 2. 순수 가상 함수를 선언하고 정의를 작성하는 이유는? 생각해 낼 수 있는 모든 이유나 상황을 제시하라.

① 순수 가상 소멸자를 위해서

알디 시피 순수 가상 소멸자를 만들어야만 할 경우, 그 소멸자의 본체도 정의해 두어야 한다. 왜냐하면 가상 소멸자의 호출 매카니즘이 파생 소멸자에서 기본 클래스 소멸자를 직접(vtbl을 거치지 않고) 호출 하므로, 본체가 꼭 있어야 한다. 만약 없다면, 링크 에러가 나게 된다.

예제 코드와 컴파일 경고 사진


② 항상 의도적인 디폴트 동작만을 허용하기 위해서

디폴트 동작을 조용히 상속되길 원하지 않을 경우, 기본 동작을 정의 해서 사용 된다. 이 방법은 GOF의 책 Design Patterns에 나온 상태 패턴(State Pattern)을 보면, 잘 활용 할수 있다고 한다.

예제코드


③ 부분적 동작을 제공하기 위해서

② 에서 제공했던것 처럼, 부분적으로 사용 할 필요가 있을 경우, 순수가상 함수라도 정의해 두는게 유용할 때가 있다고 한다.


④ 허술한 컴파일러의 진단을 피해가기 위해서

아주 가끔식 의도하지 않게, 순수 가상 함수가 호출 되는 경우가 있다. 잘 작성된 코드라면 이런 문제가 생기지 않겠지만, ... 아주 가끔식 .. 호출 된다고 한다.(어떨때 호출 되는지는 모르겠다. C++ 고급책에 나온다고 하니,, 언제가 볼수 있으리..)

이런 문제를 모든 컴파일러가 꼭 짚어내지 못하기 때문에, 순수 가상함수가 절대 호출 되지 말아야 될 경우, 기본 정의를 해 두고, 그곳에 치명적인 에러가 발생 하도록 만들어 두면 된다.


총평

애초에 순수 가상 함수를 정의하는 일 따윈 없다. 라고 생각 하고 있었던 나에겐 참 유용한 항목이였다. 특히 ④ 의 경우에는 ... 정말일까? 란 의구심이 들 정도였다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기