首页 > 代码库 > C++ 类的继承、虚拟继承、隐藏、占用空间

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 a13 {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的析构函数

 

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