Изучая язык программирования C++, я открыл для себя интересную вещь, которая заключается в том, что классы в C++ — ничто иное как поименованная область действия которая включает в себя множество объявлений(определений) функций(методов), некоторые метаданные, и две структуры, первая из которых определяет статические поля класса(далее «структура класса»), а вторая объявляет поля объекта данного класса(далее «структура объекта»)…..
Таким образом, получив указатели на эти структуры(в случае «структура класса» необходимо хотя бы 1 статическое поле с ключом доступа public), становится возможной модификация полей защищенных ключами доступа private и protected.
Примеры:
#include <iostream> using namespace std; /*--Пример №1:--*/ class myclass // подопытный зверек { public: int pub; private: int priv; public: void print_priv() { cout << priv << endl; } } myobj; /* * внутренности "структуры объекта" myobj будут чем то типа: * * struct { * int pub; * int priv; * } myobj; * */ int main1() { int*buf = &myobj.pub;// кладем в buf адрес myobj.pub buf++;// переходим на sizeof int байт, теперь buf указывает на myobj.priv *buf = 1;// извлекаем из buf адрес myobj.priv, и записываем константу myobj.print_priv();// печатаем защищенное поле объекта return 0; } /*--Пример №2:--*/ class myclass2 { private: int priv; public: void print_priv() { cout << priv << endl; } } myobj2; int main2() { int*buf; buf = (int*) &myobj2; *buf = 2;// модифицируем myobj2.priv myobj2.print_priv(); return 0; } /*--Пример №3:--*/ class myclass3 { private: static int priv; public: static int pub; static void print_priv() { cout << myclass3::priv << endl; } }; int myclass3::priv; int myclass3::pub; int main3() { int*buf; buf = &myclass3::pub; buf--;// модифицируем myclass3::priv *buf = 3; myclass3::print_priv(); return 0; } int main() { main1(); main2(); main3(); return 0; }
Comments ( 0 )