#include #include class Base { int secret_ = 7; protected: int count_ = 0; public: int secret() const { return secret_; } }; class PublicChild : public Base { public: void set_peer(PublicChild& peer, int value) { peer.count_ = value; } int count() const { return count_; } }; class PrivateChild : private Base { public: int exposed_secret() const { return secret(); } }; int main() { static_assert(std::is_base_of::value, "base exists"); static_assert(std::is_convertible::value, "public"); static_assert(!std::is_convertible::value, "private"); PublicChild first, second; first.set_peer(second, 9); assert(second.count() == 9); PrivateChild hidden; assert(hidden.exposed_secret() == 7); }