Навколо public, private і protected, c для всіх

Тема досить побита, проте, я все-таки вирішив почати з неї. Думаю, новачкам буде корисно.

Отже, public, private і protected - це модифікатори доступу, а не видимості, як помилково думають деякі. Private члени видно зовні класу, але не доступні.

Тепер коротко, кому який доступ вони надають.

  • Public - доступ відкритий усім, хто бачить визначення даного класу.
  • Private - доступ відкритий самому класу (тобто функцій-членів даного класу) і друзям (friend) даного класу, як функцій, так і класами.
  • Protected - доступ відкритий класів, похідних від даного.

Далі наведено приклади доступу із зазначенням які поля в яких місцях програми доступні.

У C ++ існує public-успадкування, private-успадкування і protected-успадкування. Залежно від того, який тип використовується, змінюється доступ до членів базового класу для клієнтів похідного. У таблиці зведена інформація про цю зміну.

Вихідний модифікатор доступу

Наостанок приведу кілька прийомів, за допомогою яких можна «достукатися» до закритих функцій або даних. Припустимо, у нас є клас some і нам потрібно обнулити закриту змінну c.

  • Модифікувати визначення класу, додавши одного (функцію або клас)
  • Скористатися препроцесором:

Створити клас з таким же розташуванням в пам'яті і скористатися reinterpret_cast для перетворення покажчиків:

Якщо у «зламувати» класу є шаблонна функція, можна її спеціалізувати своїм типом:

Очевидно, що спосіб з reinterpret_cast працює тільки для доступу до закритих членам даних або виклику віртуальних функцій. Решта ж способи дозволяють як модифікувати закриті дані, так і викликати закриті невіртуальні методи.