Only constructors cannot be virtual. It wouldn't make sense if they could, since virtual is used to direct a function call to the proper derived class when you don't know which derived type a pointer or reference refers to. When you call the constructor, you are creating the object, so you always know the derived type.

And destructors should almost always be virtual if the class is intended to be used as a base class.