所以基类中的private
成员也在继承的类中但不能访问它,对吧?
它们实际上是在分配给继承对象的内存中吗?
答案 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(构造函数被调用)。