C ++继承大小与空派生类对象

问题描述 投票:0回答:3
#include<iostream>
using namespace std;
class base {
 int arr[10];
};
class b1: public base { };

class b2: public base { };

class derived: public b1, public b2 {};

int main(void)
{
    cout << sizeof(derived);
    return 0;
}

因为在c ++中默认情况下类的成员是私有的,为什么sizeof派生类是80。

c++ inheritance
3个回答
2
投票

访问说明符private仅与派生类中基类成员的可访问性相关。派生类包含它派生自的类的子对象。在这种情况下,它包含b1b2子对象。所以它的大小是它们的大小的总和。


2
投票

你的论证线是有缺陷的。隐私与sizeof无关。

考虑这个例子:

class base {
    int value = 42;
public:
    int get() { return value; } 
};

class derived : public base {};

derived确实继承了get,它没有(直接)访问value,但当然在derived实例中有成员value。您可以通过在get()上调用derived轻松说服自己;)


1
投票

derived继承了b1b2,所以它的大小至少是它们的大小的总和,每个大小至少是10个ints的大小,40个字节和32位ints。这给了我们至少80.会员可见性在这里不相关,它不会影响类型的大小。显然,数组不能为derived优化,公开一个base(两次!),应该包含base类型的完全一样的子对象 - 否则你将如何将它向上转换为base

© www.soinside.com 2019 - 2024. All rights reserved.