Если у меня есть класс Base, по крайней мере, с одной виртуальной функцией и класс Derived, который наследуется отдельно от него, то (uintptr_t)derived - (uintptr_t)static_cast<Base*>(derived)
гарантированно (с помощью Itanium ABI) будет равен нулю, даже если Derived не является стандартным макетом. Однако в общем случае это не обязательно верно (например, множественное наследование).
Можно ли написать трейт, который можно использовать для определения того, является ли один класс основным базовым классом для другого?
Полезные разделы из Itanium ABI:
http://refspecs.linux-foundation.org/cxxabi-1.83.html
Основной базовый класс
Для динамического класса уникальный базовый класс (если есть), с которым он разделяет виртуальный указатель со смещением 0. Это первый (в прямом порядке базовых классов) невиртуальный динамический базовый класс, если он существует.
Динамический класс
Класс, требующий указателя виртуальной таблицы (поскольку он или его базы имеют одну или несколько виртуальных функций-членов или виртуальных базовых классов).