百合文库
首页 > 网文

C 类的实例化对象的大小之SIZEOF()(3)

2023-10-25 来源:百合文库
更进一步的解释:当类中有虚函数的时候,编译器会为类插入一个我们看不及爱你的数据并建立一个表。这个表就是虚函数表。那个我们看不见的数据就是指向虚函数表的指针——虚表指针。虚函数表就是为了保存类中的虚函数的地址。
我们能够把虚函数表理解成一个数组,数组中的每一个元素存放的就是类中虚函数的地址。当调用虚函数的时候,程序不是像普通函数那样直接跳到函数的代码处,而是先取出虚表指针即得到虚函数表的地址,依据这个来到虚函数表里,从这个表理取出该函数的指针。最后调用该函数。
实例六:
class E
{
public:
E()
{
}
virtual ~E()
{
}
private:
int a ;
char *p;
static int b;
};
E e;
cout << sizeof(e) << endl;
执行结果:24

C  类的实例化对象的大小之SIZEOF()


解释:考察静态成员变量的内存分配。
因为静态成员变量是在静态存储区分配空间的,它不属于实例的一部分。因此类中的static成员变量不占领空间。
实例七:
class F:public E
{
public:
F()
{
}
~F()
{
}
private:
int c;
};
E e;
cout << sizeof(e) << endl;
执行结果:32
解释:派生类对象的存储空间 = 基类存储空间  派生类特有的非static数据成员的空间,也要遵循所继承的最大的那个自己长度。个人理解是的顺序是成员变量的,按照顺序char *在int c之前
实例八:
class G: public virtual E
{
public:
G()
{
}

C  类的实例化对象的大小之SIZEOF()


猜你喜欢