[c++代码] class Base1Class { public: Base1Class(){ base_1_data = 33; }; ~Base1Class(){}; int base_1_data; virtual void virtual_test_1(){ base_1_data = 10; }; virtual void virtual_test_3(){ base_1_data = 11; }; }; class Base2Class: public Base1Class { public: Base2Class(){ base_2_data = 44; }; ~Base2Class(){}; int base_2_data; virtual void virtual_test_2(){ base_2_data = 10; }; virtual void virtual_test_3(){ base_1_data = 22; }; }; class MyClass: public Base2Class { public: MyClass(){ data1 =1; data2 = 2;}; ~MyClass(){}; int data1; int data2; void assign_test() { data1 = 5; data2 = 6; } virtual void virtual_test_my() { data2 = 3; } virtual void virtual_test_1() { base_1_data = 99; } }; int main() { MyClass * pMyClass; Base2Class * pBase2Class; pMyClass = new MyClass; pBase2Class = new Base2Class; pMyClass->virtual_test_my(); pBase2Class->virtual_test_2(); ((MyClass*)pBase2Class)->virtual_test_2(); pMyClass->virtual_test_2(); ((Base2Class*)pMyClass)->virtual_test_2(); delete pMyClass; delete pBase2Class; return 0; } [ASM代码] .file "testfunc.cpp" .section .gnu.linkonce.t._ZN10Base1ClassC2Ev,"ax",@progbits .align 2 .weak _ZN10Base1ClassC2Ev .type _ZN10Base1ClassC2Ev, @function _ZN10Base1ClassC2Ev: .LFB3: pushl %ebp .LCFI0: movl %esp, %ebp .LCFI1: movl $_ZTV10Base1Class+8, %eax movl 8(%ebp), %edx movl %eax, (%edx) movl 8(%ebp), %eax movl $33, 4(%eax) popl %ebp ret .LFE3: .size _ZN10Base1ClassC2Ev, .-_ZN10Base1ClassC2Ev .globl __gxx_personality_v0 .section .gnu.linkonce.t._ZN10Base1ClassD2Ev,"ax",@progbits .align 2 .weak _ZN10Base1ClassD2Ev .type _ZN10Base1ClassD2Ev, @function _ZN10Base1ClassD2Ev: .LFB6: pushl %ebp .LCFI2: movl %esp, %ebp .LCFI3: movl $_ZTV10Base1Class+8, %edx movl 8(%ebp), %eax movl %edx, (%eax) popl %ebp ret .LFE6: .size _ZN10Base1ClassD2Ev, .-_ZN10Base1ClassD2Ev .section .gnu.linkonce.t._ZN10Base1Class14virtual_test_1Ev,"ax",@progbits .align 2 .weak _ZN10Base1Class14virtual_test_1Ev .type _ZN10Base1Class14virtual_test_1Ev, @function _ZN10Base1Class14virtual_test_1Ev: .LFB8: pushl %ebp .LCFI4: movl %esp, %ebp .LCFI5: movl 8(%ebp), %eax movl $10, 4(%eax) popl %ebp ret .LFE8: .size _ZN10Base1Class14virtual_test_1Ev, .-_ZN10Base1Class14virtual_test_1Ev .section .gnu.linkonce.t._ZN10Base1Class14virtual_test_3Ev,"ax",@progbits .align 2 .weak _ZN10Base1Class14virtual_test_3Ev .type _ZN10Base1Class14virtual_test_3Ev, @function _ZN10Base1Class14virtual_test_3Ev: .LFB9: pushl %ebp .LCFI6: movl %esp, %ebp .LCFI7: movl 8(%ebp), %eax movl $11, 4(%eax) popl %ebp ret .LFE9: .size _ZN10Base1Class14virtual_test_3Ev, .-_ZN10Base1Class14virtual_test_3Ev .section .gnu.linkonce.t._ZN10Base2ClassC2Ev,"ax",@progbits .align 2 .weak _ZN10Base2ClassC2Ev .type _ZN10Base2ClassC2Ev, @function _ZN10Base2ClassC2Ev: .LFB11: pushl %ebp .LCFI8: movl %esp, %ebp .LCFI9: subl $8, %esp .LCFI10: movl 8(%ebp), %eax movl %eax, (%esp) call _ZN10Base1ClassC2Ev movl $_ZTV10Base2Class+8, %edx movl 8(%ebp), %eax movl %edx, (%eax) movl 8(%ebp), %eax movl $44, 8(%eax) leave ret .LFE11: .size _ZN10Base2ClassC2Ev, .-_ZN10Base2ClassC2Ev .section .gnu.linkonce.t._ZN10Base2ClassC1Ev,"ax",@progbits .align 2 .weak _ZN10Base2ClassC1Ev .type _ZN10Base2ClassC1Ev, @function _ZN10Base2ClassC1Ev: .LFB12: pushl %ebp .LCFI11: movl %esp, %ebp .LCFI12: subl $8, %esp .LCFI13: movl 8(%ebp), %eax movl %eax, (%esp) call _ZN10Base1ClassC2Ev movl $_ZTV10Base2Class+8, %edx movl 8(%ebp), %eax movl %edx, (%eax) movl 8(%ebp), %eax movl $44, 8(%eax) leave ret .LFE12: .size _ZN10Base2ClassC1Ev, .-_ZN10Base2ClassC1Ev .section .gnu.linkonce.t._ZN10Base2ClassD2Ev,"ax",@progbits .align 2 .weak _ZN10Base2ClassD2Ev .type _ZN10Base2ClassD2Ev, @function _ZN10Base2ClassD2Ev: .LFB14: pushl %ebp .LCFI14: movl %esp, %ebp .LCFI15: subl $8, %esp .LCFI16: movl $_ZTV10Base2Class+8, %eax movl 8(%ebp), %edx movl %eax, (%edx) movl 8(%ebp), %eax movl %eax, (%esp) call _ZN10Base1ClassD2Ev leave ret .LFE14: .size _ZN10Base2ClassD2Ev, .-_ZN10Base2ClassD2Ev .section .gnu.linkonce.t._ZN10Base2ClassD1Ev,"ax",@progbits .align 2 .weak _ZN10Base2ClassD1Ev .type _ZN10Base2ClassD1Ev, @function _ZN10Base2ClassD1Ev: .LFB15: pushl %ebp .LCFI17: movl %esp, %ebp .LCFI18: subl $8, %esp .LCFI19: movl $_ZTV10Base2Class+8, %eax movl 8(%ebp), %edx movl %eax, (%edx) movl 8(%ebp), %eax movl %eax, (%esp) call _ZN10Base1ClassD2Ev leave ret .LFE15: .size _ZN10Base2ClassD1Ev, .-_ZN10Base2ClassD1Ev .section .gnu.linkonce.t._ZN10Base2Class14virtual_test_2Ev,"ax",@progbits .align 2 .weak _ZN10Base2Class14virtual_test_2Ev .type _ZN10Base2Class14virtual_test_2Ev, @function _ZN10Base2Class14virtual_test_2Ev: .LFB16: pushl %ebp .LCFI20: movl %esp, %ebp .LCFI21: movl 8(%ebp), %eax movl $10, 8(%eax) popl %ebp ret .LFE16: .size _ZN10Base2Class14virtual_test_2Ev, .-_ZN10Base2Class14virtual_test_2Ev .section .gnu.linkonce.t._ZN10Base2Class14virtual_test_3Ev,"ax",@progbits .align 2 .weak _ZN10Base2Class14virtual_test_3Ev .type _ZN10Base2Class14virtual_test_3Ev, @function _ZN10Base2Class14virtual_test_3Ev: .LFB17: pushl %ebp .LCFI22: movl %esp, %ebp .LCFI23: movl 8(%ebp), %eax movl $22, 4(%eax) popl %ebp ret .LFE17: .size _ZN10Base2Class14virtual_test_3Ev, .-_ZN10Base2Class14virtual_test_3Ev .section .gnu.linkonce.t._ZN7MyClassC1Ev,"ax",@progbits .align 2 .weak _ZN7MyClassC1Ev .type _ZN7MyClassC1Ev, @function _ZN7MyClassC1Ev: .LFB20: pushl %ebp .LCFI24: movl %esp, %ebp .LCFI25: subl $8, %esp .LCFI26: movl 8(%ebp), %eax movl %eax, (%esp) call _ZN10Base2ClassC2Ev movl $_ZTV7MyClass+8, %edx movl 8(%ebp), %eax movl %edx, (%eax) movl 8(%ebp), %eax movl $1, 12(%eax) movl 8(%ebp), %eax movl $2, 16(%eax) leave ret .LFE20: .size _ZN7MyClassC1Ev, .-_ZN7MyClassC1Ev .section .gnu.linkonce.t._ZN7MyClassD1Ev,"ax",@progbits .align 2 .weak _ZN7MyClassD1Ev .type _ZN7MyClassD1Ev, @function _ZN7MyClassD1Ev: .LFB23: pushl %ebp .LCFI27: movl %esp, %ebp .LCFI28: subl $8, %esp .LCFI29: movl $_ZTV7MyClass+8, %eax movl 8(%ebp), %edx movl %eax, (%edx) movl 8(%ebp), %eax movl %eax, (%esp) call _ZN10Base2ClassD2Ev leave ret .LFE23: .size _ZN7MyClassD1Ev, .-_ZN7MyClassD1Ev .section .gnu.linkonce.t._ZN7MyClass15virtual_test_myEv,"ax",@progbits .align 2 .weak _ZN7MyClass15virtual_test_myEv .type _ZN7MyClass15virtual_test_myEv, @function _ZN7MyClass15virtual_test_myEv: .LFB25: pushl %ebp .LCFI30: movl %esp, %ebp .LCFI31: movl 8(%ebp), %eax movl $3, 16(%eax) popl %ebp ret .LFE25: .size _ZN7MyClass15virtual_test_myEv, .-_ZN7MyClass15virtual_test_myEv .section .gnu.linkonce.t._ZN7MyClass14virtual_test_1Ev,"ax",@progbits .align 2 .weak _ZN7MyClass14virtual_test_1Ev .type _ZN7MyClass14virtual_test_1Ev, @function _ZN7MyClass14virtual_test_1Ev: .LFB26: pushl %ebp .LCFI32: movl %esp, %ebp .LCFI33: movl 8(%ebp), %eax movl $99, 4(%eax) popl %ebp ret .LFE26: .size _ZN7MyClass14virtual_test_1Ev, .-_ZN7MyClass14virtual_test_1Ev .text .align 2 .globl main .type main, @function main: .LFB27: leal 4(%esp), %ecx .LCFI34: andl $-16, %esp pushl -4(%ecx) .LCFI35: pushl %ebp .LCFI36: movl %esp, %ebp .LCFI37: pushl %ebx .LCFI38: pushl %ecx .LCFI39: subl $32, %esp .LCFI40: movl $20, (%esp) call _Znwj movl %eax, %ebx movl %ebx, (%esp) call _ZN7MyClassC1Ev movl %ebx, -16(%ebp) movl $12, (%esp) call _Znwj movl %eax, %ebx movl %ebx, (%esp) call _ZN10Base2ClassC1Ev movl %ebx, -12(%ebp) movl -16(%ebp), %eax movl (%eax), %eax addl $12, %eax movl (%eax), %edx movl -16(%ebp), %eax movl %eax, (%esp) call *%edx movl -12(%ebp), %eax movl (%eax), %eax addl $8, %eax movl (%eax), %edx movl -12(%ebp), %eax movl %eax, (%esp) call *%edx movl -12(%ebp), %eax movl (%eax), %eax addl $8, %eax movl (%eax), %edx movl -12(%ebp), %eax movl %eax, (%esp) call *%edx movl -16(%ebp), %eax movl (%eax), %eax addl $8, %eax movl (%eax), %edx movl -16(%ebp), %eax movl %eax, (%esp) call *%edx movl -16(%ebp), %eax movl (%eax), %eax addl $8, %eax movl (%eax), %edx movl -16(%ebp), %eax movl %eax, (%esp) call *%edx movl -16(%ebp), %eax movl %eax, -32(%ebp) cmpl $0, -32(%ebp) je .L34 movl -32(%ebp), %eax movl %eax, (%esp) call _ZN7MyClassD1Ev movl -32(%ebp), %eax movl %eax, (%esp) call _ZdlPv .L34: movl -12(%ebp), %eax movl %eax, -28(%ebp) cmpl $0, -28(%ebp) je .L36 movl -28(%ebp), %eax movl %eax, (%esp) call _ZN10Base2ClassD1Ev movl -28(%ebp), %eax movl %eax, (%esp) call _ZdlPv .L36: movl $0, %eax addl $32, %esp popl %ecx popl %ebx popl %ebp leal -4(%ecx), %esp ret .LFE27: .size main, .-main .weak _ZTV7MyClass .section .gnu.linkonce.r._ZTV7MyClass,"a",@progbits .align 8 .type _ZTV7MyClass, @object .size _ZTV7MyClass, 24 _ZTV7MyClass: .long 0 .long _ZTI7MyClass .long _ZN7MyClass14virtual_test_1Ev .long _ZN10Base2Class14virtual_test_3Ev .long _ZN10Base2Class14virtual_test_2Ev .long _ZN7MyClass15virtual_test_myEv .weak _ZTI7MyClass .section .gnu.linkonce.r._ZTI7MyClass,"a",@progbits .align 4 .type _ZTI7MyClass, @object .size _ZTI7MyClass, 12 _ZTI7MyClass: .long _ZTVN10__cxxabiv120__si_class_type_infoE+8 .long _ZTS7MyClass .long _ZTI10Base2Class .weak _ZTS7MyClass .section .gnu.linkonce.r._ZTS7MyClass,"a",@progbits .type _ZTS7MyClass, @object .size _ZTS7MyClass, 9 _ZTS7MyClass: .string "7MyClass" .weak _ZTI10Base2Class .section .gnu.linkonce.r._ZTI10Base2Class,"a",@progbits .align 4 .type _ZTI10Base2Class, @object .size _ZTI10Base2Class, 12 _ZTI10Base2Class: .long _ZTVN10__cxxabiv120__si_class_type_infoE+8 .long _ZTS10Base2Class .long _ZTI10Base1Class .weak _ZTS10Base2Class .section .gnu.linkonce.r._ZTS10Base2Class,"a",@progbits .type _ZTS10Base2Class, @object .size _ZTS10Base2Class, 13 _ZTS10Base2Class: .string "10Base2Class" .weak _ZTI10Base1Class .section .gnu.linkonce.r._ZTI10Base1Class,"a",@progbits .align 4 .type _ZTI10Base1Class, @object .size _ZTI10Base1Class, 8 _ZTI10Base1Class: .long _ZTVN10__cxxabiv117__class_type_infoE+8 .long _ZTS10Base1Class .weak _ZTS10Base1Class .section .gnu.linkonce.r._ZTS10Base1Class,"a",@progbits .type _ZTS10Base1Class, @object .size _ZTS10Base1Class, 13 _ZTS10Base1Class: .string "10Base1Class" .weak _ZTV10Base2Class .section .gnu.linkonce.r._ZTV10Base2Class,"a",@progbits .align 8 .type _ZTV10Base2Class, @object .size _ZTV10Base2Class, 20 _ZTV10Base2Class: .long 0 .long _ZTI10Base2Class .long _ZN10Base1Class14virtual_test_1Ev .long _ZN10Base2Class14virtual_test_3Ev .long _ZN10Base2Class14virtual_test_2Ev .weak _ZTV10Base1Class .section .gnu.linkonce.r._ZTV10Base1Class,"a",@progbits .align 8 .type _ZTV10Base1Class, @object .size _ZTV10Base1Class, 16 _ZTV10Base1Class: .long 0 .long _ZTI10Base1Class .long _ZN10Base1Class14virtual_test_1Ev .long _ZN10Base1Class14virtual_test_3Ev .section .eh_frame,"a",@progbits .Lframe1: .long .LECIE1-.LSCIE1 .LSCIE1: .long 0x0 .byte 0x1 .string "zP" .uleb128 0x1 .sleb128 -4 .byte 0x8 .uleb128 0x5 .byte 0x0 .long __gxx_personality_v0 .byte 0xc .uleb128 0x4 .uleb128 0x4 .byte 0x88 .uleb128 0x1 .align 4 .LECIE1: .LSFDE29: .long .LEFDE29-.LASFDE29 .LASFDE29: .long .LASFDE29-.Lframe1 .long .LFB27 .long .LFE27-.LFB27 .uleb128 0x0 .byte 0x4 .long .LCFI34-.LFB27 .byte 0xc .uleb128 0x1 .uleb128 0x0 .byte 0x9 .uleb128 0x4 .uleb128 0x1 .byte 0x4 .long .LCFI35-.LCFI34 .byte 0xc .uleb128 0x4 .uleb128 0x4 .byte 0x4 .long .LCFI36-.LCFI35 .byte 0xe .uleb128 0x8 .byte 0x85 .uleb128 0x2 .byte 0x4 .long .LCFI37-.LCFI36 .byte 0xd .uleb128 0x5 .byte 0x4 .long .LCFI39-.LCFI37 .byte 0x84 .uleb128 0x4 .byte 0x83 .uleb128 0x3 .align 4 .LEFDE29: .ident "GCC: (GNU) 4.2.0 20060617 (experimental)" .section .note.GNU-stack,"",@progbits