It's all there, it's the debugger that is at fault.
Try opening a memory window and locate
p_derived->__vfptr
and you will see all entries in the vtable.
Derived and DDerived should have two different vtables, since their second entry differs, virtual f.
The layout of the vtable is compiler dependant, but it seems all virtual functions are put in order using VC++.
You can look at the entire vtable if you add this helper variable:
void (**vt)() = *(void (***)())p_derived;
and then inspect
vt,2
in a watch window.
This[
^] was a similar discussion, which should have all credit for the
vt
trick.