Изучая язык программирования 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 )