下面是一个a.cpp
#include <stdio.h>
class A
{
public:
A(){puts("A\n");}
};
class B:public A
{
public:
B(){puts("B\n");}
};
int main()
{
B b;//
printf ("-------------------\n");
B c();// 不会调用构造函数,这相当于声明了一个函数 类似 int f();
return 0;
}
执行结果:
root@anybackup:~/sxz# ./a
A
B
-------------------
A
B
-------------------
调用顺序,下面来看汇编代码
root@anybackup:~/sxz# g++ -S a.cpp
root@anybackup:~/sxz# cat a.s
.file
"a.cpp"
.section
.rodata
.LC0:
.string
"A\n"
.section
.text._ZN1AC2Ev,"axG",@progbits,_ZN1AC5Ev,comdat
.align 2
.weak
_ZN1AC2Ev
_ZN1AC2Ev: //A的构造函数
.LFB1:
.cfi_startproc
pushq
%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq
%rsp, %rbp
.cfi_def_cfa_register 6
subq
$16, %rsp
movq
%rdi, -8(%rbp)
movl
$.LC0, %edi
call
puts
//输出 A
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size
_ZN1AC2Ev, .-_ZN1AC2Ev
.weak
_ZN1AC1Ev
.set
_ZN1AC1Ev,_ZN1AC2Ev
.section
.rodata
.LC1:
.string
"B\n"
.section
.text._ZN1BC2Ev,"axG",@progbits,_ZN1BC5Ev,comdat
.align 2
.weak
_ZN1BC2Ev
.type
_ZN1BC2Ev, @function
_ZN1BC2Ev:
//B的构造函数
.LFB4:
.cfi_startproc
pushq
%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq
%rsp, %rbp
.cfi_def_cfa_register 6
subq
$16, %rsp
movq
%rdi, -8(%rbp)
movq
-8(%rbp), %rax
movq
%rax, %rdi
call _ZN1AC2Ev //调用A的构造函数
movl
$.LC1, %edi
call
puts
//输出 B
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE4:
.size
_ZN1BC2Ev, .-_ZN1BC2Ev
.weak
_ZN1BC1Ev
.set
_ZN1BC1Ev,_ZN1BC2Ev
.section
.rodata
.LC2:
.string
"-------------------"
.text
.globl
main
.type
main, @function
main
:
.LFB6:
.cfi_startproc
pushq
%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq
%rsp, %rbp
.cfi_def_cfa_register 6
subq
$16, %rsp
leaq
-1(%rbp), %rax
movq
%rax, %rdi
call _ZN1BC1Ev //调用B的构造函数
movl
$.LC2, %edi
call
puts
movl
$0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE6:
.size
main, .-main
.ident
"GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section
.note.GNU-stack,"",@progbits
可以看出是在B的构造函数里调用的A的构造函数,而且是隐式调用的