как я могу сделать, чтобы вызвать вторую функцию?
Вы бы назвали это так:
p->fun_2();
печатает:
derived-2
Виртуальные таблицы и указатели виртуальных функций - это детали реализации вашего компилятора.В общем, вам не следует заботиться о таких деталях реализации, потому что если вы пишете непереносимый код.На самом деле, я даже не уверен, имеет ли ваш код неопределенное поведение или нет, даже если это так, даже компилятор, который размещает vpointer в том месте, где вы ожидаете, может напечатать мусор.Во всяком случае, не делайте этого, если вам не нужно, что на самом деле никогда;).
Как указатель функции, указатели на функции теряют много своей шершавости, если вы используете псевдонимы, например
using base_mem_fun = void (base::*)();
base_mem_fun first_base = &base::fun_1;
(p->*first_base)();
отпечатки:
base-1