Я могу воспроизвести это точно с вашим кодом в VS2019 при компиляции в режиме отладки (оптимизация компилятора отключена). Я вполне уверен, что это только проблема с отображением в окне отладчика.
![locals window](https://i.stack.imgur.com/xEOVr.png)
Обратите внимание, что массив __vfptr
отображается только в SuperVirtual
, не прямо под dsv_01
, поэтому, конечно, отладчик знает только о функциях в SuperVirtual
vtable.
Но если вы посмотрите на столбец Value
для __vfptr
, вы ' Заметим, что в SuperVirtual::'vftable'[3]
и DerivedSV_01::'vftable[4]'
(оба отмечены зеленым) даны разные размеры массивов.
Давайте посмотрим на память в vftables (адреса vftables можно увидеть в начале столбца Value
для записей __vfptr
, помеченных оранжевым и красным).
![memory window](https://i.stack.imgur.com/yCKfM.png)
Вы заметите, что SuperVirtual::'vftable'[3]
имеет два функциональных указателя (отмечены коричневым) и nullptr
. DerivedSV_01::'vftable[4]'
имеет три указателя (отмечены фиолетовым и синим) и nullptr
. Окно отладчика сообщает нам, какие первые две записи (также отмечены фиолетовым), но взгляните на третью запись в окне наблюдения (отмечена синим).
![watch window](https://i.stack.imgur.com/zJt3S.png)
Отладчик говорит, что третья запись - DerivedSV_01::onlyForDerivedSV_01
. Это полностью соответствует вашим (и моим) ожиданиям.