{

왜냐하면, 파생 객체의 생성자 호출 순서는 항상 기반 객체이기 때문이다.

잘 이해가 안간다....?

그러니까 기반 객체의 생성자가 호출 될 때 가상 함수가 호출 되어 지면, 파생 객체는 아직 만들어 지지 않았기 때문에, 파생 객체의 함수가 호출 되지 않고,  기반의 함수가 호출 된다.

이는 개발자에게 가독성은 물론이거나와 몹시 어렵다는 느낌을 줄 수 밖에 없다. 디스트럭트 역시 마찬가지다.

예제는?


무엇이 호출 되는지 보길 바란다.


겪어 봤나?

2008년 9월경, Template Method Pattern 을 사용하겠다는 자만으로, 겪어 봤었다. 그 후로는 가상 함수 호출 할 떄 각별히 주의를 갖게 되었다.


책의 내용은?

객체 생성 후에 가상 함수 호출 하라는 식으로 예제가 있다.(사후 컨스트럭션 호출...) Exceptional C++ 에선 비멤버 함수를 하나 만들어 두고, 거기에 일 처리 방식을 기록 한 뒤에, 객체를 밀어 넣어 템플릿 메서드 패턴을 구현하고 있는 것을 보았다.


객체 내부에서 하는 것도 좋은 방법이지만, 비멤버 함수 하나로 구현 할 수 있다면, 그게 더 좋은거 같다. 왜냐하면, 클래스의 무게를 줄여주기 때문이다.

}


'책 정리 > C++ Coding Standards : C++ 코딩의 정석' 카테고리의 다른 글

항목 54 : 개체의 조각화를 피하라. 기반 클래스 내에서의 복사보다는 Clone을 활용하라. ( Avoid slicing. Consider Clone instead of copying in base classes. )  (0) 2009.04.06
항목 53 : 복사의 허용 여부는 명확하게 지정하라. ( Explicitly enable or disable copying. )  (0) 2009.04.06
항목 52 : 일관된 방식으로 복사하고 제거하라. ( Copy and destroy consistently. )  (0) 2009.04.03
항목 51 : 디스트럭터 재할당 그리고 swap은 절대 실패하지 않는다. ( Destructors, deallocation, and swap never fail. )  (0) 2009.04.03
항목 50 : 기반 클래스 디스트럭터는 공용과 가상 또는 보호와 비가상으로 만들어라. ( Make base class destructors public and virtual, or protected and nonvirtual. )  (0) 2009.04.03
항목 49 : 컨스트럭터와 디스트럭터에서는 가상 함수의 호출을 피하라. ( Avoid calling virtual functions in constructors and destructors. )  (0) 2009.04.03
항목 48 : 컨스트럭터 내에서 할당 대신 초기화를 사용 하라. ( Prefer initialization to assignment in constructors. )  (0) 2009.04.01
항목 47 : 멤버 변수의 정의와 선언은 같은 순서로 하라. ( Define and initialize member variables in the same order. )  (0) 2009.04.01
항목 46 : 특정한 클래스에 맞는 new를 제공한다면, 모든 표준 형식을 제공해야 한다. ( If you provide any class-specific new, provide all of the standard forms (plain, in-place, and nothrow). )  (0) 2009.04.01
항목 45 : new와 delete는 항상 같이 제공하라. ( Always provide new and delete together. )  (0) 2009.04.01
항목 44 : 비멤버 함수를 활용하라. ( Prefer writing nonmember nonfriend functions. )  (0) 2009.03.31
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기

댓글을 달아 주세요

">