Constructors and destructors are not inherited. So why would their visibility be inherited?
You may want to check standard to be sure, but cppreference says this, emphasis mine:
If no user-defined destructor is provided for a class type (struct, class, or union), the compiler will always declare a destructor as an inline public member of its class.
So, if you want ~MyHelper
to be protected, you must declare it explicitly.
Note, that if MyInterface
had a virtual destructor, the implicit destructor of MyHelper
would also be virtual. So this aspect is inherited, sort of. Again, you'll want to consult standard if you want to be sure, but this is mentioned in c++ faq lite
For completeness, here's Herb Sutters guidelines on how to use virtuality in general and with destructors.