e.g. for this code: -------------------------- struct A { virtual void a(); }; struct B { virtual void b(); }; struct C : virtual A, virtual B { C(); virtual void key_function(); virtual void a(); virtual void b(); }; C::C() { a(); b(); } void C::key_function() {} -------------------------- the assembly for C::C() at -O3 is -------------------------- _ZN1CC1Ev: # complete ctor pushq %rbx movq %rdi, %rbx movq $_ZTV1C+40, (%rbx) movq $_ZTV1C+88, 8(%rbx) callq _ZN1C1aEv # call to C::a is devirtualized movq (%rbx), %rax movq %rbx, %rdi popq %rbx jmpq *16(%rax) # call to C::b is not! ... _ZN1CC2Ev: # base ctor pushq %rbx movq %rdi, %rbx movq (%rsi), %rax movq %rax, (%rbx) movq 8(%rsi), %rcx movq -32(%rax), %rax movq %rcx, (%rbx,%rax) movq 16(%rsi), %rax movq (%rbx), %rcx movq -40(%rcx), %rcx movq %rax, (%rbx,%rcx) movq (%rbx), %rax callq *(%rax) # looks like even C::a is not devirtualized movq (%rbx), %rax movq %rbx, %rdi popq %rbx jmpq *16(%rax) # call C::b is not devirtualized -------------------------- The same pattern holds if I define C::C() as "b(); a();" - only the first vcall in the complete ctor is devirtualized.