- virtual function 뿐만 아니라 dynamic_cast나 typeid 같은 language의 RTTI(runtime type information) 파트에서도 Derived object 의 base class construction 중에는 그 object의 타입이 base class 인 것으로 인식.
- ctor 내에서 virtual func.을 직접 부르는 것뿐만 아니라, init()과 같은 함수를 통해 간접적으로 부르는 것도 마찬가지 이유로 불가.
Derived object의 base class member 부분을 초기화하는 동안, 이 객체는 base class 객체인 것으로 인식됨. Derived object 의 derived class member 부분이 초기화 되기 시작한 후에야 이 객체는 derived class 로 인식됨.
해결책
- 유일한 해결책은 ctor 나 dtor에서 virtual func. 을 부르지 않는 것.
- 다른 방법으로 해당 func. 을 virtual 대신 일반 func.으로 구현하고, construction 과정에서 필요한 정보를 ctor의 param.로 넘겨주는 방법을 사용.
이 때, param. 를 넘겨주는 helper func.을 (private) static func.으로 구현하면 좋음. func. 을 static으로 구현함으로써 helper func. 내에서 아직 initialize 되지 않은 data member 를 부르는 실수를 막을 수 있음.
Summary
- Don't call virtual functions during construction or destruction, because such calls will never go to a more derived class than that of the currently executing constructor or destructor.
Reference
- Effective C++ by Scott Meyers
댓글 없음:
댓글 쓰기