class Base { protected: int someValue; void doSomething(); public: void thePublicMethod(); void anotherPublicMethod(); };Since
someValue
and doSomething()
are protected, they are visible and can be used by any subsequent derived class. Then, let’s have a derived class:class Derived : public Base { void newStuff() { someValue = 42; doSometing(); } };The public methods are still public. Now see that I used
someValue
and doSomething()
inside newStuff()
method, which is private. And now I don’t want subsequent derived classes to have access to someValue
and doSometing()
. I want to hide them from subsequent derived classes.At first, I thought it wouldn’t be possible without redefining and overriding, which would add bloat here. But then I came across a trick I didn’t know, which allows you to hide both methods and variables without redefining or overriding them:
class Derived : public Base { Base::someValue; Base::doSomething; // now they are protected: hidden! void newStuff() { doSometing(); someValue = 42; } };This trick changes the access modifier of methods and member variables without touching them, with zero overhead or additional bloat. Yes, C++ is a damn complex language.