C++ 类的继承、虚拟继承、隐藏、占用空间

主函数:

 1 #include <iostream>
 2 #include "test.h"
 3 #include "testfuc.h"
 4 using namespace std;
 5 
 6 int main(void)
 7 {    
 8     a *p=new b();
 9 
10     p->fuc();
11 
12     cout<<"指针p占用空间"<<sizeof(p)<<endl;
13     cout<<"类占用空间"<<sizeof(a)<<endl;
14 
15     delete p;
16 
17     return 0;
18 }
test.h
 1 #ifndef TEST_H
 2 #define TEST_H
 3 
 4 class a
 5 {
 6 public:
 7     a();
 8     ~a();
 9     void virtual fuc();
10 };
11 
12 class b:public a
13 {
14 public:
15     b();
16     ~b();
17     void fuc();
18 };
19 
20 #endif
testfuc.h
 1 #ifndef testfuc_h
 2 #define testfuc_h
 3 
 4 #include <iostream>
 5 using namespace std;
 6 
 7 a::a()
 8 {
 9     cout<<"a的构造函数"<<endl;
10 }
11 
12 a::~a()
13 {
14     cout<<"a的析构函数"<<endl;
15 }
16 
17 b::b()
18 {
19     cout<<"b的构造函数"<<endl;
20 }
21 b::~b()
22 {
23     cout<<"b的析构函数"<<endl;
24 }
25 
26 void a::fuc()
27 {
28     cout<<"a的函数"<<endl;
29 }
30 
31 void b::fuc()
32 {
33     cout<<"b的函数"<<endl;
34 }
35 #endif

运行结果:

a的构造函数

b的构造函数

b的函数

指针p占用空间8

类占用空间8   //每个虚函数的类都要有8字节(64位系统)指针指向自己的虚函数表

a的析构函数

 

a *p=new b();
改为
b *p=new b();

运行结果:

a的构造函数

b的构造函数

b的函数

指针p占用空间8

类占用空间8

b的析构函数

a的析构函数

 

将virtual去掉 a *p=new b(); 

运行结果:

a的构造函数

b的构造函数

a的函数

指针p占用空间8

类占用空间1

a的析构函数

 

将virtual去掉 b *p=new b(); 

运行结果:

a的构造函数

b的构造函数

b的函数

指针p占用空间8

类占用空间1

b的析构函数

a的析构函数

 


原文地址:https://www.cnblogs.com/bindong/p/5883608.html