Прочитал я тут пару статей об устройстве объектной модели C++, и мне стало интересно, можно ли записывать данные в приватные поля класса. Я сразу же написал такой код: Code: class A { public: int a; private: int b; }; void PrintClassMembersInt(void* Object, int size ,bool vTable = false) { for(int i = (vTable ? sizeof(int*) : 0);i < size / 4; ++i) { printf("%d\n", reinterpret_cast<int*>(Object)[i]); } } void WriteClassMemberInt(void* Object, int offset, int Value, bool vTable = false) { reinterpret_cast<int*>(Object)[offset] = Value; } int main() { A obj; obj.a = 103; WriteClassMemberInt(&obj, 1, 25555); PrintClassMembersInt(&obj, sizeof obj); getchar(); return 0; } Вопрос: для чего нужны приватные поля класса, если в них так просто записать нужные тебе данные?! Сорри если ответ банален, я всего лишь новичок с бардаком в голове...
Я в сишном синтаксисе не очень шарю, но ты пишешь в поле А, а оно у тебя обьявлено как паблик. Ты в поле B попробуй записать!
Такие вопросы автоматически делают тебя либо знатным извращенцем, либо неопытным троллем. В конце-концов, ты же можешь открыть код и просто перенести нужные поля в public-секцию! Действительно, зачем нужны эти private-поля! А еще можно переписать всю память программы нулями, и тогда она упадет! Зачем C++ предоставляет такую возможность, если можно так просто убить программу?!! Зачем все эти функции, переменные, если всё так просто переписывается??? Он анально записал в поле B.
По этому посту троллингом занимаюсь точно не я. Мне просто интересно, как устроена объектная модель C++. Я пишу такие извращенные коды, чтобы понять как он работает.
Ну, если не троллингом, то ты точно извращенец. Я привел парочку вопросов, схожих с твоим. Наверное, стоит понимать, что вся эта модель сделана для адекватных людей. Да и что ты хотел? Неведомое расположение приватных полей по хитрым смещениям, чтобы ты даже через жопу их найти не смог? Или некий запрет на запись в них каким-то образом, приводящий к краху программы? Вдумайся и пойми обсурдность того, что ты делаешь.
Я уже писал выше, что делаю это в сугубо образовательных целях. Я не старый программист-задрот который знает все и вся, сорри уж...
В образовательных целях делаются вещи в пределах разумного, пожалуй. А подобные твоему эксперименты скорее всего ничему не научат. Дети, в образовательных целях тыкающие пальцы в розетку, обычно потом уже не образовываются. А если не нравится типизация и запреты C++ - добро пожаловать в asm (или на крайняк Си) - там всё можно.
При чем тут это? Мне просто кажется, что при попытке записи в приватное поле, как минимум должно выбрасываться исключение, или программа должна аварийно завершаться...
На уровне адекватного использования компилятора это контролируется (затычка в розетку). Но почему компилятор должен такое контролировать, если ты сам с помощью reinterpret_cast и смещений записываешь в обычную память программы свое значение? Программа, по-твоему, должна регулярно просчитывать свои контрольные суммы, или ставить точки останова на области памяти приватных полей, и следить за такой неадекватной активностью? Ты выколупываешь затычку вилкой и все равно суешь пальцы, получая 220. Ай-ай-ай, розетка не проконтролировала сие деяние и убила неосторожного экспериментатора, как же так, ведь должен был вырубиться свет во всем доме...