1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include <iostream> using namespace std; /** 1. c++的类中成员若不加修饰符的话,默认是private 2. 调用构造函数时,先递归调用最顶级的父类构造函数,再依次到子类的构造函数。 3. 调用析构函数时相反,先调用最底层的子类析构函数,再依次到父类的构造函数。 4. 空类的sizeof(A)大小为1,多个空类继承后的子类大小也是1 */ class A{ public : A() { cout<< "A constructor" <<endl; } ~A() { cout<< "A destructor" <<endl; } }; class B:A{ public : B() { cout<< "B constructor" <<endl; } ~B() { cout<< "B destructor" <<endl; } }; class C:B{ public : C() { cout<< "C constructor" <<endl; } ~C() { cout<< "C destructor" <<endl; } virtual void eat()=0; //纯虚函数会存在一个虚函数指针。64bit系统上故大小为8 }; class D:B{ void eat() { cout<< "D eat" <<endl; } }; class E:B{ int age; //不加修饰符的话,默认是private public : int num; E( int a, int b):age(a),num(b){ cout<< "E constructor" <<endl; }; ~E() { cout<< "E destructor" <<endl; } void eat() { cout<< "E eat" <<endl; } }; class F:C{ //继承的类中有虚函数,存在一个虚函数指针,64bit系统上占8字节 int age; //不加修饰符的话,默认是private public : int num; F( int a, int b):age(a),num(b){ cout<< "F constructor" <<endl; }; ~F() { cout<< "F destructor" <<endl; } void eat() { cout<< "F eat" <<endl; } }; //C++关于类结构体大小和构造顺序、析构顺序的测试。 int main() { cout<< "run" <<endl; cout<< "sizeof(A)=" << sizeof (A)<<endl; //大小为1 cout<< "sizeof(B)=" << sizeof (B)<<endl; //大小为1 cout<< "sizeof(C)=" << sizeof (C)<<endl; //虚函数会存在一个虚函数指针。64bit系统上故大小为8 cout<< "sizeof(D)=" << sizeof (D)<<endl; //大小为1,非虚函数不占用类大小。 cout<< "sizeof(E)=" << sizeof (E)<<endl; //大小为4+4 E e(11,22); cout<< "e.num=" <<e.num<<endl; E* e2= new E(33,44); cout<< "e2->num=" <<e2->num<<endl; delete e2; cout<< "sizeof(F)=" << sizeof (F)<<endl; //大小为8+4+4 F f(55,66); cout<< "f.num=" <<f.num<<endl; f.eat(); return 0; } |
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/earbao/article/details/119899830