Вы можете решить обе проблемы (вызовы виртуальных функций и виртуальное наследование), если вам известен динамический тип объекта, на который имеется только указатель на него. Каждый (полиморфный) объект в C ++ имеет ровно один динамический тип , который определяется в момент его создания. Например. когда вы пишете new Foo
, этот объект имеет динамический тип Foo
, даже если вы храните только void*
.
A vtable
- это механизм для хранения информации о динамическом типе объекта таким образом, чтобы ее можно было получить с помощью базового указателя. Вы можете хранить довольно много вещей в vtable: указатели на функции, смещения приведения, std::type_info
даже объекты.