解決: コンストラクタを 2 つ作る
B を作る時はこっちを呼ぶ
00000000004007a8 <B::B()>: 4007a8: 53 push %rbx 4007a9: 48 89 fb mov %rdi,%rbx 4007ac: e8 87 ff ff ff callq 400738 <A::A()> 4007b1: 48 c7 03 a8 0a 40 00 movq $0x400aa8,(%rbx) 4007b8: bf e6 08 40 00 mov $0x4008e6,%edi 4007bd: e8 b6 fd ff ff callq 400578 <puts@plt> 4007c2: 5b pop %rbx 4007c3: c3 retq
B b;
4007d0: 48 8d 7c 24 10 lea 0x10(%rsp),%rdi 4007d5: e8 ce ff ff ff callq 4007a8 <B::B()>
子クラスから呼ぶ用
00000000004006b6 <B::B()>: 4006b6: 48 83 ec 08 sub $0x8,%rsp 4006ba: 48 8b 06 mov (%rsi),%rax 4006bd: 48 89 07 mov %rax,(%rdi) 4006c0: bf e6 08 40 00 mov $0x4008e6,%edi 4006c5: e8 ae fe ff ff callq 400578 <puts@plt> 4006ca: 48 83 c4 08 add $0x8,%rsp 4006ce: c3 retq 4006cf: 90 nop
んで D は
000000000040074c <D::D()>: 40074c: 53 push %rbx 40074d: 48 89 fb mov %rdi,%rbx 400750: e8 e3 ff ff ff callq 400738 <A::A()> 400755: be 08 09 40 00 mov $0x400908,%esi 40075a: 48 89 df mov %rbx,%rdi 40075d: e8 54 ff ff ff callq 4006b6 <B::B()> 400762: 48 8d 7b 08 lea 0x8(%rbx),%rdi 400766: be 10 09 40 00 mov $0x400910,%esi 40076b: e8 2c ff ff ff callq 40069c <C::C()> 400770: 48 c7 03 38 09 40 00 movq $0x400938,(%rbx) 400777: 48 c7 43 08 50 09 40 movq $0x400950,0x8(%rbx) 40077e: 00 40077f: bf e8 08 40 00 mov $0x4008e8,%edi 400784: e8 ef fd ff ff callq 400578 <puts@plt> 400789: 5b pop %rbx 40078a: c3 retq 40078b: 90 nop
http://www.codesourcery.com/public/cxx-abi/abi.html#vtable-ctor