Я знаю, что с точки зрения хорошей практики программирования это плохая идея, но я пытался решить относительно сложную проблему и надеялся на некоторое понимание. По сути, я пытаюсь вывести всех членов класса следующим образом:
class protoCalc
{
private:
int x;
int y;
virtual int basicAddition()
{
return x + y;
}
virtual int basicMultiplication()
{
return x*y;
}
public:
protoCalc(){
x = 14;
y = 120;
}
};
Доступ к x и y оказался достаточно простым; для этого я написал функцию (включая свои мысли о том, как это работает, правильно они или нет):
int private_member_Print(void* proto)
{
protoCalc* medium = (protoCalc*)proto;
protoCalc halfway = *medium;
int* ptr = ((int *)(&halfway));
return ptr[1];
}
Вышеприведенное вернет значение x, если используется ptr[2], оно вернет значение y.
Теперь у меня есть два вопроса, первый из которых — на что указывает ptr[0]? Разве этот бит памяти не должен быть занят закрытым членом x, поскольку это первый член класса protoCalc? Если нет, то что занимает этот адрес?
Во-вторых, как мне получить доступ к виртуальным функциям? Моей первой интуицией было то, что адрес ptr[3] будет занят виртуальной функцией basicAddition(), а адрес ptr[4] — функцией basicMultiplication(), однако это не так. Когда это не подтвердилось, моей следующей мыслью было то, что ptr[0] содержит указатель на местоположение виртуальной таблицы-члена, содержащей две функции, которые я искал. Однако и это оказалось ложным.
Итак, как мне получить доступ к этим виртуальным функциям вне класса, поскольку я получил доступ к закрытым членам x и y? Очевидно, я мог бы изменить обстоятельства, чтобы облегчить задачу, но это лишило бы смысла проблему.
ptr[0]
, вероятно, указывает на указатель таблицы виртуальных функций, но на это нельзя полагаться. stackoverflow.com/ вопросы/10925115/ - person Neil Kirk   schedule 02.11.2014