Адрес печати виртуальной функции членства

Я пытаюсь распечатать адрес виртуальной функции членства. Если я знаю, какой класс реализует функцию, я могу записать:

print("address: %p", &A::func);

Но я хочу сделать что-то вроде этого:

A *b = new B();

printf("address: %p", &b->func); 
printf("address: %p", &b->A::func);

Однако это не компилирует. Действительно ли возможно сделать что-то вроде этого, возможно, ища адрес в vtable во времени выполнения?

31
задан Boann 4 March 2017 в 19:24
поделиться

3 ответа

Указатели на функции-члены не всегда являются простыми адресами памяти. См. Таблицу в этой статье , в которой показаны размеры указателей на функции-члены в разных компиляторах - некоторые достигают 20 байт.

Как указано в статье, указатель на функцию-член на самом деле представляет собой большой двоичный объект данных, определенных реализацией, которые помогают разрешить вызов через указатель. Вы можете хранить и называть их ОК, но если вы хотите их распечатать, что вы печатаете? Лучше всего рассматривать его как последовательность байтов и получать его длину через sizeof .

6
ответ дан 27 November 2019 в 22:49
поделиться

Насколько я могу судить по стандарту, единственное время, когда вы получаете динамическое связывание, это во время вызова виртуальной функции call. И как только вы вызвали функцию, вы выполняете утверждения внутри функции (т.е. вы не можете "остановиться на полпути" в вызове и получить адрес)

Я думаю, это невозможно.

1
ответ дан 27 November 2019 в 22:49
поделиться

Для меня это не имеет большого смысла. Если у вас есть обычная функция:

void f( int n ) {
}

то вы можете взять ее адрес:

f

но вы не можете взять адрес функции call, что вы, похоже, и хотите сделать.

1
ответ дан 27 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: