You should never do this, never do this unless you have a good reason.
Calling a virtual method from a constructor is a catastrophe awaiting its appearance.
The construction of the C # object follows the order of the class hierarchy; that is, when the constructor is called, the constructor of the base class is called first, then the immediately created constructor of the class, then the next, etc. etc. (if I'm not mistaken, in C ++ it is the other way around, which can lead to even more confusion).
Therefore, when you call the virtual method from the constructor, what really happens, the virtual method, if it is overridden (which in your case is a guarantee), will be executed before the constructor of the implementation class is called. This means that the method can be executed before the state of the object was correctly initialized (usually through the constructor, if this method does not depend on any state of the object, this template is not a problem, although I would still not recommend it) .
If it is absolutely necessary to use it, it is recommended to use the Initialize() method and use any virtual form. Forcing users to call Initialize before using the object is a trivial task, and you guarantee that the state of the object will always be valid when creating a virtual call.
source share