假设我有两个A和B类,如图所示:
class A {
void function1() {
cout<<"hello";
}
int member1;
public:
char member2;
};
class B : public A
{
int member3;
void function2() {
cout<<"Hello to you too";
}
public:
float member4;
};
现在,如果我创建了一个B类对象,那么该对象的大小是多少?即使A类的继承是私有的还是受保护的,它是否会相同?
答案 0 :(得分:2)
git commit --reset-author
适用于C ++中的所有类型(sizeof
类型除外,char
按定义生成sizeof
)是实现定义的。
根据经验,您不希望派生类小于基类。但差异 - 如果有的话 - 取决于编译器,成员的对齐,编译器如何管理填充以确保不同大小的成员(和类类型)对齐等等。
我通常不希望访问权限(1
,public
,protected
)直接影响类类型的大小。编译器可能会选择以不同的顺序存储成员,具体取决于他们的访问权限,或者可能不会。因此,大小可能会也可能不会改变,但不同的编译器可能会以不同的方式做事。但是,原则上,编译器不需要仅仅因为更改某些成员或继承的访问权限而更改类类型的大小。
答案 1 :(得分:0)
B类对象的大小将是A类对象的大小加上B类添加的额外数据成员所占用的内存量。方法不计算,因此您可以根据需要添加任意数量的方法,而不会增加对象的大小。
答案 2 :(得分:0)
这取决于编译器,因为它们具有某种程度的自由度。
我未经测试的猜测是,例如在一个常见的x86系统上A
应该与两个整数(4个字节)和B
一样大,再加上另外两个整数(总共8个字节)。
原因是CPU像对齐数据一样,因此int + char
类将被分配为int + char + 3-byte-padding
,以使这些类的数组使所有int
正确对齐到地址这是4的倍数。
int
和float
在x86上的大小相同,因此两个额外的int
来自B
。
鉴于没有虚函数,每个实例不需要其他数据,因为所有调度都将在编译时决定。
私有/公共/受保护只是在编译时强制执行的逻辑墙,并且在运行时不需要任何额外的存储空间。
答案 3 :(得分:0)
private
,protected
或public
继承与大小无关。它们只会影响基本成员对外部代码的可见性。