출처 : Effective C++. 항목 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자.
특정 기반클래스를 상속받은 자식클래스의 객체를 생성할때(동적할당이든 정적할당이든) 기반클래스에 가상함수를 선언하고 기반 클래스의 생성자에서 그 가상함수를 호출하는 경우 아무리 자식클래스에서 가상함수를 재구현 했다고 하더라도 기반 클래스의 생성자에서 호출되는 것은 기반 클래스의 가상함수이다.
이것은 C++ 생성자 호출순서와 관련이 있는데 기반 클래스가 생성된 이후 자식 클래스가 생성되기 때문에 기반 클래스의 생성자 시점에서 가상함수를 호출하면 그때는 자식 클래스가 생성이 안된 시점이기 때문이다.
가상함수 뿐만 아니라 typeid, dynamic_cast 등의 런타임 타입정보를 사용하는 모든 동작에서 기반클래스의 생성자안은 기반클래스의 타입으로 동작하게 된다.
즉 일반적으로 원하는 다형성으로써의 동작은 하지 않으니 이런 경우는 피해야 한다.
즉 일반적으로 원하는 다형성으로써의 동작은 하지 않으니 이런 경우는 피해야 한다.