To add to 's answer, it’s essentially due to how C++ was intentionally designed (see stack overflow). It doesn’t allow calling virtual functions from a constructor as the language is trying to protect you from null references. Personally I don’t like this either, but it makes some sense. Also read the linked FAQ, especially the part regarding using the “Dynamic Binding During Initialization idiom”.