派生类对象是否包含基类的私有成员?它在记忆中看起来像什么?

时间:2015-03-29 10:45:19

标签: c++ class inheritance base derived

class base{
private:
  int a;
public:
  int b;
  void setData(){
    a = 10; b = 5;
  }
};
class derived: public base{
private:    
   int c;
public:
  // b is inherited
};

void main(){
  derived D1;

  D1.setData();
}

我了解到私人成员并没有被继承。因此,派生类对象中不存在私有变量a(在基类中)。我的问题是当调用D1.setData()时,如果不存在,它如何为a赋值? 我很确定我的这个概念是错误的,所以有人可以解释一下这是如何工作的吗?是否在创建派生类对象时创建了基类成员?

2 个答案:

答案 0 :(得分:1)

  

我了解到私人成员不会被继承。

当然它们是继承的:否则,需要这些私有变量的基类的所有成员函数都将被破坏。尽管继承类无法访问私有成员,但基类仍保留对它们的完全访问权限。

  

有人可以解释一下这是如何工作的吗?

继承类derived的布局包括存储基类私有成员a的位置。基类的所有方法都可以访问base::a。同时,派生类仍然无法访问:任何从a访问derived的尝试都会导致编译时错误。

答案 1 :(得分:0)

私有成员变量是继承的,但无法从外部访问。继承的内存模式很简单:

class base {
    int x;
};

class subclassCpp : public base {
    int y;
};

class subclassCStyle {
    base a;
    int y;
};

现在,subclassCppsubclassCStyle具有完全相同的内存模式,无论私有/受保护状态等等。这应该说明内存的布局方式。

对于另一个问题,“在创建派生类对象时是否也创建了基类成员?”

答案是肯定的,总是在基类上调用构造函数。如果您不自己添加,则会自动调用默认构造函数。如果基类没有默认构造函数,它将不允许您创建一个子类构造函数,该构造函数无法正确调用初始化基础所需的构造函数。因此,只要子类中的构造函数被执行,就没有合法的方法可以最终得到创建子类时尚未初始化的基类。