Навколо public, private і protected, c для всіх
Тема досить побита, проте, я все-таки вирішив почати з неї. Думаю, новачкам буде корисно.
Отже, public, private і protected - це модифікатори доступу, а не видимості, як помилково думають деякі. Private члени видно зовні класу, але не доступні.
Тепер коротко, кому який доступ вони надають.
- Public - доступ відкритий усім, хто бачить визначення даного класу.
- Private - доступ відкритий самому класу (тобто функцій-членів даного класу) і друзям (friend) даного класу, як функцій, так і класами.
- Protected - доступ відкритий класів, похідних від даного.
Далі наведено приклади доступу із зазначенням які поля в яких місцях програми доступні.
У C ++ існує public-успадкування, private-успадкування і protected-успадкування. Залежно від того, який тип використовується, змінюється доступ до членів базового класу для клієнтів похідного. У таблиці зведена інформація про цю зміну.
Вихідний модифікатор доступу
Наостанок приведу кілька прийомів, за допомогою яких можна «достукатися» до закритих функцій або даних. Припустимо, у нас є клас some і нам потрібно обнулити закриту змінну c.
- Модифікувати визначення класу, додавши одного (функцію або клас)
- Скористатися препроцесором:
Створити клас з таким же розташуванням в пам'яті і скористатися reinterpret_cast для перетворення покажчиків:
Якщо у «зламувати» класу є шаблонна функція, можна її спеціалізувати своїм типом:
Очевидно, що спосіб з reinterpret_cast працює тільки для доступу до закритих членам даних або виклику віртуальних функцій. Решта ж способи дозволяють як модифікувати закриті дані, так і викликати закриті невіртуальні методи.