关于C++函数分配空间问题
如下有两个类A和B,B继承A:
class A
{
int a;
double dfunc();
virtual func1(int na);
virtual func2();
}
class B : public A
{
virtual func1(int na);
}
请问:sizof(A)=?
sizeof(B)=?
我测试的结果是8,两个都是8,请解释为什么会是这个结果
A类中的 dfunc(),func1(),和func2()各占多大字节?请解释为什么
[解决办法]
virtual函数不占字节
[解决办法]
不占字节
int和虚指针8个字节
空类时,或并无数据成员的时候,占一个字节占位
[解决办法]
A的8字节由一个 int和一个虚表指针构成,
B继承于A,所以B也有一个int a,另外加上它自己的虚表指针,也是8个字节。
[解决办法]
数据成员+虚指针
[解决办法]
只是一张表而已,总是一个指针指向地址头
[解决办法]
class A:
1)数据成员int a占4个字节
2)同时因为A具有虚成员函数,所以该类每个对象中需要一个指向该类虚函数表的指针,故又4个字节
class B:
由于B本身不具有额外的数据成员,只是重新实现了一个虚函数,所以B的对象包含的内容和A的是相同的,即数据成员int a,和指向类B虚函数表的指针,故也是8个字节
成员函数(无论是否为虚)不会给一个类的实例带来空间上的开销,但是一个具有虚成员函数的类的对象内要额外包含一个指向该类虚表的指针。
[解决办法]
所有的虚函数占用一个4字节的指针空间 + 其它成员变量占用的空间
所以你的结果是4 + sizeof(int) = 4 + 4 = 8;
[解决办法]
关键:我们在这里用了继承,所以我们的这两个类是共用一张虚表的.
类的大小只和我们的非静态成员变量有关系和我们的函数没有关系.如果类中有虚函数,则只是在每个类中多插一个指向虚表的指针而已.