为什么私人成员会被继承?

时间:2013-10-15 17:27:40

标签: c++ inheritance access-modifiers

所以基类中的private成员也在继承的类中但不能访问它,对吧? 它们实际上是在分配给继承对象的内存中吗?

3 个答案:

答案 0 :(得分:7)

  

它们实际上是在分配给继承对象的内存中吗?

是的,他们需要存在。私有成员是基类的实现细节的一部分。没有它们,通常,基类将无法运行(这就是为什么它们首先存在)。

将它们设为私有只允许基类创建它的实现,但是它会选择,而不会将它暴露给任何人,包括子类。

答案 1 :(得分:6)

是。例如,您可以使用操纵私有数据的基类中的公共函数,即使在派生类的实例中也是如此:

class Base { 
    int x;
public:
    Base() : x(0) {}
    void inc() { ++x; }
    void show() { std::cout << x << "\n"; }
};

class Derived : public Base { 
};

int main() { 
    Derived d;
    d.show();
    d.inc();
    d.show();
}

使用正常运行的编译器,必须显示:

0
1

...显示Base对象中的数据存在于Derived对象中,即使它不是(直接)可访问的。

当然,对于C ++中的几乎任何东西,都有“as-if”规则 - 如果编译器可以确定它可以某种方式为程序产生正确的可观察行为,即使不包括该程序的私有部分也是如此。基类,那么它是免费的。最明显的例子是,如果你在基类中包含了一些从未在实践中使用的东西(成员函数或数据)。

答案 2 :(得分:2)

是的,

当构造派生类的对象时,它的所有基类也首先被构造。

考虑这个例子:

class Base
{
 int x;

 public:
  Base(int px)
   : x(px)
  {
  }
};

class Derived : public Base
{
 int y;
public:
  Derived(int px, int py)
   : y(py), Base(px)
  {
  }
};

此示例编译并运行,并在到达Derived构造函数的主体之前初始化Base(构造函数被调用)。