There is no single best answer to a question like this, but I can share some experience from my team. The approach we use is the following. The project is split into something we internally call "modules". These are basically just C++ classes, but what is special about them is that those are the biggest/most important classes in the project. Interfaces of these classes are exposed to other modules (this is configured via CMake) so they can be used with one another. Each module is a small static library, and inside that library there are additional C++ classes that are necessary only to complete the functionality of the containing module, but are irrelevant to other modules. These are configured to be private withing the module (again via CMake) and other modules have no knowledge of these classes.
So after a short explanation of how our project is organized, getting back to your question:
For the main classes of the module (usually 1-3) that need to be exposed to other modules, we create an interface (pure virtual class) with detailed documentation (precise contract detailing how the client should use the class, sequence diagrams, detailed documentation for all methods, etc.). Then we have a mock that inherits from this interface and it is exposed to other modules, and an implementation class (what you call Production class) that also inherits but is private withing the module (other classes don't need the implementation details, only knowledge how to create and use an instance of the interface).
For other classes that are private within each module, we just create virtual methods inside Production class to keep things simpler, and their mocks just inherit from the Production class. By the way, your issue with the default constructor should easily be solved by declaring a protected default constructor in the Production class?
In my opinion, this provides a good balance between avoiding too much boilerplate code (by having an interface for every single class), but also providing nice, clean and precisely defined interfaces for the most important classes in your project.