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