发布日期:2016-02-29 11:43 来源: 标签: 编程语言 C++开发语言 C++对象空间 C++对象存储
本章我们主要学习C++中类对象空间中一般继承下的对象存储,下面们就做一下具体讲解,希望大家多多支持中国站长网络学院。
1、虚表指针占用4个字节原则 
①对于一个类而言,在不存在虚函数的情况下,类的大小等于成员大小之和(按照对其原则);
②当存在虚拟函数时,由于要保存虚表指针,故多占用4个字节。 
2、子类共享父类的虚表指针原则 
在普通继承下,子类与父类共享一个虚表,子类不需要另外添加内存。 
3、虚基类表指针占用4字节原则 
①在虚继承的情况下,继承了多个继承了同一个父类的中间类的子类只保存了一个同他基类的备份;
②但每个中间类都需要需要保存指向基类表的指针来指向共同的基类。 
#include <iostream> 
using namespace std; 
class A1 { 
     int numA1; }; 
/*与A1比较,存在虚函数的情况下,需要保存虚函数表指针占4个字节*/----规则1-② 
class A2 { 
     int numA2;      virtual FunA2(); }; 
/*与A2比较,当不存在不同于父类的虚函数时,子类与父类共享保存虚函数表的指针*/----规则2 
class B1 : A2 { 
     int numB1; }; 
*与A2比较,当存在不同于父类的虚函数时,子类与父类共享保存虚函数表的指针*/----规则2 
class B2 : A2 { 
     int numB2;      virtual FunB2(); }; 
/*与B1比较,虚继承需要保存指向虚基类表的指针占4个字节*/----规则3 
class B3 : virtual A2 { 
     int numB3; }; 
 /*虚继承下,若子类中有不同于父类的虚函数,则需要不同于父类的指向虚函数表的指针*/----规则3 
class B4 : virtual A2 { 
     int numB4;      virtual FunB4(); }; 
/*虚继承下,共同的基类只有一个备份,但每个虚继承的类中多了一个只想那个虚基类表的指针*/----规则3-② 
class C1 : B3, B4 { 
     int numC1; }; 
void main() { 
cout << "sizeof A1 is : " << sizeof(A1) << endl;        /* 4 */      
cout << "sizeof A2 is : " << sizeof(A2) << endl;        /* 8 */      
cout << endl; 
cout << "sizeof B1 is : " << sizeof(B1) << endl;        /* 12 */      
cout << "sizeof B2 is : " << sizeof(B2) << endl;        /* 12 */      
cout << "sizeof B3 is : " << sizeof(B3) << endl;        /* 16 */      
cout << "sizeof B4 is : " << sizeof(B4) << endl;        /* 20 */      
cout << endl; 
 cout << "sizeof C1 is : " << sizeof(C1) << endl;        /* 32 */      
system("pause"); }
C的内存分布: 
B3指向虚基类表的指针             4 
B3自己的存储区域                 4 
B4自己的指向虚函数表的指针       4 
B4指向虚基类表的指针             4 
B4自己的存储区域                 4 
C1自己的存储区域                 4 
基类的存储区域                   8 

相关评论

专题信息
    Visual C++是一个功能强大的可视化软件开发工具,是高等院校计算机及相关专业主要核心课程。 本教程对Visual C++ 的应用与开发进行了详细系统的介绍,内容主要包括:Visual C++程序的建立,菜单、工具栏和状态栏的创建,对话框和常用控件,窗口、文档与视图,图形绘制,数据库应用,多媒体技术等。 本教程以案例教学为主,各章节都附有大量的实例,并且操作步骤详细,有利于引导读者更好的消化、理解和实际应用本章节所学的知识内容,希望大家能多多支持中国站长网络学院!