Это либо padding, либо v-таблицы. Может быть, оба ...
Компилятор может вставить указатель v-таблицы для каждого базового класса, в котором объявлен хотя бы один виртуальный метод. (Кроме того, когда вы выполняете C-cast, static_cast или dynamic_cast из конкретного класса в не первый базовый класс, компилятор изменит значение указателя на значение базового класса или его v-таблицы. )
Давайте разберемся с этим.
Demo
наследуется от implements<Demo,IDemo>
implements
определяется следующим образом:
struct implements : impl::producers<D, I...>, impl::base_implements<D, I...>::type
{
Сейчасмы попадаем в шум WinRT. Но это, кажется, предполагает множественное наследование. Но проще разобраться с этим, отладчик .... Вот так. Первый vtable для IUnknown. Другое относится к IInspectable.
Так что это имеет смысл. Каждая v-таблица является 8-байтовым указателем. И m_references также 8 байтов. 8+8+8 = 24 = 0x18