Я пытаюсь распечатать адрес виртуальной функции членства. Если я знаю, какой класс реализует функцию, я могу записать:
print("address: %p", &A::func);
Но я хочу сделать что-то вроде этого:
A *b = new B();
printf("address: %p", &b->func);
printf("address: %p", &b->A::func);
Однако это не компилирует. Действительно ли возможно сделать что-то вроде этого, возможно, ища адрес в vtable во времени выполнения?
Указатели на функции-члены не всегда являются простыми адресами памяти. См. Таблицу в этой статье , в которой показаны размеры указателей на функции-члены в разных компиляторах - некоторые достигают 20 байт.
Как указано в статье, указатель на функцию-член на самом деле представляет собой большой двоичный объект данных, определенных реализацией, которые помогают разрешить вызов через указатель. Вы можете хранить и называть их ОК, но если вы хотите их распечатать, что вы печатаете? Лучше всего рассматривать его как последовательность байтов и получать его длину через sizeof
.
Насколько я могу судить по стандарту, единственное время, когда вы получаете динамическое связывание, это во время вызова виртуальной функции call. И как только вы вызвали функцию, вы выполняете утверждения внутри функции (т.е. вы не можете "остановиться на полпути" в вызове и получить адрес)
Я думаю, это невозможно.
Для меня это не имеет большого смысла. Если у вас есть обычная функция:
void f( int n ) {
}
то вы можете взять ее адрес:
f
но вы не можете взять адрес функции call, что вы, похоже, и хотите сделать.