Our Blog

C++ как я обошел private и protected

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