基类中的私有元素是否会增加派生类的大小?

时间:2012-05-24 18:30:22

标签: c++ inheritance

// inheritence experiment

#include"stdafx.h"
#include<iostream> 

using namespace std;

class base
{
private:
    int i;
};

class derived: public base
{
private:
    int j;
};

int main()
{
    cout << endl << sizeof(derived) << endl << sizeof(base);
    derived o1;
    base o2;
    cout << endl << sizeof(o1) << endl << sizeof(o2); 
}

我收到了这个输出:

  

8
  4
  8
  4

为什么会这样?基类的私有数据成员不会继承到派生类中,那么为什么我得到8个字节,派生的大小和o1?

5 个答案:

答案 0 :(得分:9)

私人会员是继承的。你无法从派生类中访问它们。

答案 1 :(得分:3)

私有成员实际上在派生类中,它们在派生类中是不可访问的。 private关键字是为了防止从基类派生的程序员更改值,基类的设计者不希望您更改它,因为它可能会改变基类的功能。

在这里查看更深入的解释

Fragile base class

答案 2 :(得分:2)

class base {
public:
  base(int v) : m_value(v) { }
  int value() { return m_value; }
private:
  int m_value;
};

class derived : private base {
  derived(int v) : base(v) { }
  int value2() { return value(); }
};

int main()
{
  derived d(2);
  return d.value2();
}

如果私有基类没有将值存储在某个地方,您如何期望这个工作?

您选择的单词“继承到派生类”让我觉得您对继承如何工作感到困惑。基类中的成员不会继承或将复制到派生类中。派生类包含基类型的实例,作为完整派生对象中的子对象,因此派生类(通常)至少与其基类的总和一样大。

考虑以下代码:

struct A {
private:
  int i;
};

struct B {
  int j;
};

struct derived : A, B {
  int k;
};

A对象在内存中以int的形式排列,B也是如此。 derived对象可以作为A对象在内存中布局,后跟B对象,后跟int,这意味着它是三个序列{ {1}}秒。基类成员是公共成员还是私有成员不会影响它。

答案 3 :(得分:1)

当然它们是继承的 - 毕竟,基类的行为可能取决于它们在那里 - 它们只是无法访问!

答案 4 :(得分:0)

基类的继承方法仍然可以使用私有成员。他们必须在那里。