After 24 years being at it and spending countless hours interviewing dozens of software engineers, I relatively recently realized that I can predict with a surprisingly high precision whether a candidate is a good programmer by getting an answer to a single question:
How long ago did you create your most recent virtual function that was not prescribed by a base class?
If the answer is a blank stare, confusion, or more than a month ago, then the engineer is very likely not above average. If not more than 2-3 weeks ago, then the programmer is pretty likely a good one.
Here is why I think this is a valid test.
These days most devs are quite well prepared for the interviews and can competently rattle off main OOP principals and names and even usages of the most common design patterns. What I observed, however, is that this knowledge is more often than not does not really translate into practice - i.e. into the the ability of spotting a pattern or a potential extensibility point, which most commonly is expressed in a virtual function.
Truly good programmers are always on the lookout for the extensibility points of their components: such engineers are fluent in using virtual functions, events, callbacks, asynchronicity and other ways of inversion of control (a term I now use with trepidation after it has been thoroughly misappropriated by the DI/IoC frameworks, which have become the Today's Way of Doing Things, like the XML was 10 years ago). Average programmers can implement an interface, but can hardly recognize the place, or see the point of creating a virtual function. Average one doe not work with the polymorphism in mind.