Wpływu na sposób generowania vtable przez kompilator nie masz. Ale możesz przyjąć pewne założenia. Na Windowsie wszystkie znaczące kompilatory są COM compatible, zatem sposób generowania vtable musi być taki sam, niezależnie od wersji czy producenta kompilatora.
Ale COM wcale nie wymaga, by to vtable które mu dajesz to było vtable wygenerowane przez kompilator.
Zmienna COM-owa (typu ICośTam*
) to wskaźnik na COM-owe vtable, w którym pierwsze trzy pola to wskaźniki na metody Add, Remove i QueryInterface, a potem dalsze metody we właściwej kolejności.
COM-a nie obchodzi co jest przed ani za vtable. Często są tam inne vtable (przy wielokrotnym dziedziczeniu), i oczywiście pola klasy też gdzieś muszą być.
Takie vtable można nawet dynamicznie generować wewnątrz QueryInterface - do tego zresztą ta metoda służy.
Oczywiście jest to rzadko potrzebne, bo w większości przypadków kompilator C++ potrafi utworzyć vtable w takim samym formacie automatycznie, a w przypadku wielokrotnego dziedziczenia wybiera się właściwe vtable za pomocą rzutowania wskaźnika, które się robi w tymże QueryInterface.
Z dyskusji w komentarzach wnioskuję, że jeżeli chcę osiągnąć to co chcę, to muszę znaleźć jakiś sposób na wygenerowanie tablicy metod w taki sam sposób dla każdej platformy i kompilatora.
Pod Windowsem COM działa tak samo pod każdym kompilatorem (obsługującym COM).
Pod uniksami można go zasymulować na tej samej zasadzie, ale tu już musisz się dowiedzieć jak wygląda ABI C++, choć zgaduję że vtable jest budowane w ten sam sposób, bo to najsensowniejszy sposób.