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