===== Исходный код на C++ ===== class Alpha { public: int data_alpha; virtual void func_alpha () = 0; }; class Beta { public: int data_beta; virtual void func_beta () = 0; }; class Gamma : public Alpha, public Beta { public: int data_gamma; virtual void func_alpha () { asm ("# func_alpha"); } virtual void func_beta () { asm ("# func_beta"); } virtual void func_gamma () { asm ("# func_gamma"); } }; int func () { static Gamma x; x.data_alpha = 1; x.data_beta = 2; x.data_gamma = 3; return sizeof (x); } ===== Параметры компиляции ===== gcc -O -fno-rtti -fno-exceptions -Wno-non-virtual-dtor -S gamma.cpp ===== Результат на ассемблере ===== .file "gamma.cpp" .section .gnu.linkonce.t._ZN5Gamma10func_alphaEv,"ax",@progbits .align 2 .weak _ZN5Gamma10func_alphaEv .type _ZN5Gamma10func_alphaEv, @function _ZN5Gamma10func_alphaEv: pushl %ebp movl %esp, %ebp #APP # func_alpha #NO_APP popl %ebp ret .size _ZN5Gamma10func_alphaEv, .-_ZN5Gamma10func_alphaEv .section .gnu.linkonce.t._ZN5Gamma9func_betaEv,"ax",@progbits .align 2 .weak _ZThn8_N5Gamma9func_betaEv .type _ZThn8_N5Gamma9func_betaEv, @function _ZThn8_N5Gamma9func_betaEv: addl $-8, 4(%esp) jmp .LTHUNK0 .size _ZThn8_N5Gamma9func_betaEv, .-_ZThn8_N5Gamma9func_betaEv .align 2 .weak _ZN5Gamma9func_betaEv .type _ZN5Gamma9func_betaEv, @function _ZN5Gamma9func_betaEv: pushl %ebp movl %esp, %ebp #APP # func_beta #NO_APP popl %ebp ret .size _ZN5Gamma9func_betaEv, .-_ZN5Gamma9func_betaEv .section .gnu.linkonce.t._ZN5Gamma10func_gammaEv,"ax",@progbits .align 2 .weak _ZN5Gamma10func_gammaEv .type _ZN5Gamma10func_gammaEv, @function _ZN5Gamma10func_gammaEv: pushl %ebp movl %esp, %ebp #APP # func_gamma #NO_APP popl %ebp ret .size _ZN5Gamma10func_gammaEv, .-_ZN5Gamma10func_gammaEv .text .align 2 .globl _Z4funcv .type _Z4funcv, @function _Z4funcv: pushl %ebp movl %esp, %ebp subl $8, %esp cmpb $0, _ZGVZ4funcvE1x jne .L8 movl $_ZGVZ4funcvE1x, (%esp) call __cxa_guard_acquire testl %eax, %eax je .L8 movl $_ZTV5Gamma+8, _ZZ4funcvE1x movl $_ZTV5Gamma+28, _ZZ4funcvE1x+8 movl $_ZGVZ4funcvE1x, (%esp) call __cxa_guard_release .L8: movl $1, _ZZ4funcvE1x+4 movl $2, _ZZ4funcvE1x+12 movl $3, _ZZ4funcvE1x+16 movl $20, %eax leave ret .size _Z4funcv, .-_Z4funcv .local _ZGVZ4funcvE1x .comm _ZGVZ4funcvE1x,8,8 .local _ZZ4funcvE1x .comm _ZZ4funcvE1x,20,4 .weak _ZTV5Gamma .section .gnu.linkonce.r._ZTV5Gamma,"a",@progbits .align 32 .type _ZTV5Gamma, @object .size _ZTV5Gamma, 32 _ZTV5Gamma: .long 0 .long 0 .long _ZN5Gamma10func_alphaEv .long _ZN5Gamma9func_betaEv .long _ZN5Gamma10func_gammaEv .long -8 .long 0 .long _ZThn8_N5Gamma9func_betaEv .weak _ZTV5Alpha .section .gnu.linkonce.r._ZTV5Alpha,"a",@progbits .align 8 .type _ZTV5Alpha, @object .size _ZTV5Alpha, 12 _ZTV5Alpha: .long 0 .long 0 .long __cxa_pure_virtual .weak _ZTV4Beta .section .gnu.linkonce.r._ZTV4Beta,"a",@progbits .align 8 .type _ZTV4Beta, @object .size _ZTV4Beta, 12 _ZTV4Beta: .long 0 .long 0 .long __cxa_pure_virtual .set .LTHUNK0,_ZN5Gamma9func_betaEv .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits