혹시 순수 가상 함수를 사용 해본적이 있는가? 그렇다면 어떤 함수를 순수 가상함수로 만들어서 사용 했는가? 이 번 항목에선 이런 질문들을 정리하기 위한 항목이라 봐도 좋을 듯 싶다.
질문 1. 순수 가상 함수는 무엇인가? 예를 들어라.
질문 2. 순수 가상 함수를 선언하고 정의를 작성하는 이유는? 생각해 낼 수 있는 모든 이유나 상황을 제시하라.
① 순수 가상 소멸자를 위해서
알디 시피 순수 가상 소멸자를 만들어야만 할 경우, 그 소멸자의 본체도 정의해 두어야 한다. 왜냐하면 가상 소멸자의 호출 매카니즘이 파생 소멸자에서 기본 클래스 소멸자를 직접(vtbl을 거치지 않고) 호출 하므로, 본체가 꼭 있어야 한다. 만약 없다면, 링크 에러가 나게 된다.
예제 코드와 컴파일 경고 사진
② 항상 의도적인 디폴트 동작만을 허용하기 위해서
디폴트 동작을 조용히 상속되길 원하지 않을 경우, 기본 동작을 정의 해서 사용 된다. 이 방법은 GOF의 책 Design Patterns에 나온 상태 패턴(State Pattern)을 보면, 잘 활용 할수 있다고 한다.
예제코드
③ 부분적 동작을 제공하기 위해서
② 에서 제공했던것 처럼, 부분적으로 사용 할 필요가 있을 경우, 순수가상 함수라도 정의해 두는게 유용할 때가 있다고 한다.
④ 허술한 컴파일러의 진단을 피해가기 위해서
아주 가끔식 의도하지 않게, 순수 가상 함수가 호출 되는 경우가 있다. 잘 작성된 코드라면 이런 문제가 생기지 않겠지만, ... 아주 가끔식 .. 호출 된다고 한다.(어떨때 호출 되는지는 모르겠다. C++ 고급책에 나온다고 하니,, 언제가 볼수 있으리..)
이런 문제를 모든 컴파일러가 꼭 짚어내지 못하기 때문에, 순수 가상함수가 절대 호출 되지 말아야 될 경우, 기본 정의를 해 두고, 그곳에 치명적인 에러가 발생 하도록 만들어 두면 된다.
총평
애초에 순수 가상 함수를 정의하는 일 따윈 없다. 라고 생각 하고 있었던 나에겐 참 유용한 항목이였다. 특히 ④ 의 경우에는 ... 정말일까? 란 의구심이 들 정도였다.
'책 정리 > More Exceptional C++' 카테고리의 다른 글
항목 15 : 최적화 미루기 Part 3 : 반복자와 참조 ( 난이도 : 6 ) (0) | 2008.12.18 |
---|---|
항목 14 : 최적화 미루기 Part 2 : 미루기에 대한 소개 ( 난이도 : 3 ) (0) | 2008.12.18 |
항목 13 : 최적화 미루기(lazy optiomization) Part 1 : 그저 평범한 String (난이도 : 2 ) (0) | 2008.12.18 |
항목 12 : inline ( 난이도 : 4 ) (0) | 2008.12.17 |
항목 28 : 다형성 제어하기 ( 난이도 : 3 ) (0) | 2008.12.16 |
항목 26 : 다중 상속과 샴 쌍둥이 문제 ( 난이도 : 4 ) (0) | 2008.12.16 |
항목 25 : 다중 상속 에뮬레이션 ( 난이도 : 5 ) (0) | 2008.12.16 |
항목 24 : 왜 다중 상속을? ( 난이도 : 6 ) (0) | 2008.12.16 |
항목 31 : 스마트 포인터 멤버 Part 2 : ValuePtr을 향해 ( 난이도 : 6 ) (0) | 2008.12.14 |
항목 30 : 스마트 포인터 멤버 Part 1 : auto_ptr로 인해 생길 수 있는 문제 ( 난이도 : 5 ) (0) | 2008.12.14 |
최근댓글