public , private, protected встречаются во-первых при определении членов класса (переменные, методы,..), во-вторых при указании типа наследования в дочернем классе.
Что касается первого варианта использования смотрим на картинку ниже:
Тут под колонкой class понимаем текущий класс.
Колонка subclasses подразумевает дочерний класс, наследуемый от класса class.
Ну и World (очень поавильное название) колонка подразумевает доступность к членам класса извне .
Все выше справедливо (конкретно для колонки subclasses) при наследовании класса с типом public. То есть :
class cl2: public cl1{...}
Если при наследовании указать private или protected, то картина меняется :
Но изменения касаются только к ограничениям доступности членов базового класса, то есть от которого наследуемся.
Для членов наследуемого класса ничего не меняется.
Примечательно , что спецификатор protected заставляет вас унаследоваться от класса, в котором этот protected член определен и к которому вы хотели бы получить доступ извне.