There are different issues with what you propose, the first of which is already dealt in other answers: you only need virtual destructors if you intend to delete through a pointer to a base (a general recommendation is to provide either a public virtual destructor or a protected non-virtual destructor as that would inhibit deletion through the base class).
There is another issue in that when a compiler sees a class definition it cannot possibly know whether it is going to be derived or not. Consider if you implement a base class in a translation unit. At a later time you derive from the class. If that derivation would imply making the constructor virtual the base class translation would have to be recompiled, or else the ODR (One Definition Rule) would be broken in your program.
If you add other translation units to the mix, things get even worse. Whenever you include a header file from a translation unit you would be forced to also manually include at least one header where a derived object from that class is defined (increasing coupling), or else, again, the compiler would generate a different definition for that single class in that translation unit (compared to the translation unit where the derived class is defined) breaking the ODR again.
The problem is that the compiler only has a partial view of your project, and cannot really infer what you need/want from what it sees.