Где находится память fn ()?
Так как это нормальная функция, где-то в разделе кода вашей программы. Это местоположение одинаково для всех экземпляров класса. Фактически, это не имеет ничего общего с созданием B
через pb
.
Есть ли в объекте указатель, указывающий на выделение памяти функцией fn ()?
Нет. Для обычной функции-члена это не требуется, поскольку адрес известен во время компиляции (или, самое позднее, во время компоновки); поэтому его не нужно хранить отдельно во время выполнения.
Для виртуальных функций ситуация иная. Указатели виртуальных функций хранятся в массиве (для краткости называемом «таблица указателей виртуальных функций» или «vtable»). Каждый класс имеет одну такую vtable, и каждый экземпляр класса хранит указатель на эту vtable. Это необходимо, потому что если указатель / ссылка типа Base
указывает на подкласс Derived
, компилятор не может узнать, какую функцию вызывать; скорее, правильная функция вычисляется во время выполнения путем поиска в соответствующей таблице. Указатель vtable также очевиден в sizeof
объекте.