Я знаю, что, насколько хороша практика программирования, это плохая идея, но я пытался решить относительно трудную проблему и надеялся на некоторое понимание. По сути, я пытаюсь вывести все элементы класса следующим образом:Доступ к частной виртуальной функции из-за пределов класса
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];
}
выше возвращает значение х, если PTR [ 2], он вернет значение y.
Теперь у меня есть два вопроса, первое из которых относится к ptr [0], указывающему на? Разве этот бит памяти не должен занимать частный член х, поскольку это первый член класса protoCalc? Если нет, то что занимает этот адрес?
Во-вторых, как мне получить доступ к виртуальным функциям? Моя первая интуиция заключалась в том, что адрес ptr [3] будет занимать виртуальная функция basicAddition() и ptr [4] функция basicMultiplication(), однако это не так. Когда это не удалось, моя следующая мысль заключалась в том, что ptr [0] содержал указатель на расположение виртуальной таблицы элементов, в которой были сохранены две функции, которые я искал. Однако это также оказалось ложным.
Как я могу получить доступ к этим виртуальным функциям вне класса, поскольку я получил доступ к частным членам x и y? Очевидно, что я мог бы изменить обстоятельства, чтобы облегчить их, но это победит цель проблемы.
Это все неопределенное поведение. Предоставляйте публичные функции для доступа к частным членам, если это то, что вы хотите сделать. –
Как только я вижу указатель на пустоту и листинг, я перестаю читать. Все, что следует, не будет хорошо для моего мозга. –
Меньше ваших проблем, но ваши функции могут быть сделаны const. И если класс имеет виртуальные функции, он должен иметь виртуальный деструктор. –