Martin's answer is correct, but deserves some further explanation.
Let's assume that vTables are the mechanism used for resolving virtual method invocations. That'll make the discussion easier.
In C++, each constructor in the inheritance hierarchy does the following:
- Call the base class constructor (if there is a base class).
- Set the instance's vTable pointer to the vTable for the current class.
- The stuff explicitly described in the constructor.
The vTable pointer changes over the course of the class initialization. As each base class constructor is invoked, the vTable "evolves" into it's most derived form.
In C#, the vTable pointer is set only once, before any of the constructor code is invoked. Only steps 1 and 3 described above happen for each class constructor in the hierarchy.
By making different design decisions here, C++ and C# essentially chose different, necessary evils.
In C++, there is the risk that a bad programmer may invoke a pure-virtual (a.k.a. "abstract") method. This happens when a base class constructor invokes a virtual method that is implemented in a more derived class. C++ also carries a risk that an overridden virtual method may be invoked.
The dangers in C#'s way of doing things are more subtle, but still potentially problematic. If a base class constructor invokes a virtual method, then that method is invoked before any of the initialization done in the constructor of the more derived class. This may violate the intended usage designed by the author of the more derived class.