那么基类中的private
成员也存在于派生类中,但是无法在派生类中访问,对吗?
它们实际上存在于分配给派生对象的内存中吗?
那么基类中的private
成员也存在于派生类中,但是无法在派生类中访问,对吗?
它们实际上存在于分配给派生对象的内存中吗?
它们实际上是分配给继承对象的内存吗?
是的,它们需要存在。私有成员是基类实现细节的一部分。通常情况下,如果没有它们,基类将无法运行(这也是它们存在的原因)。
将它们设置为私有只允许基类按照自己的方式创建其实现,而不向任何人公开,包括子类。
可以的。例如,您可以在派生类的实例中使用来自基类的公共函数来操作私有数据:
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
展示了基础对象中的数据存在于派生对象中,尽管它(直接)不可访问。
当然,在C++中几乎任何事情都有“似乎如此”的规则 - 如果编译器可以确定即使不包括基类的私有部分也可以生成程序的正确可观察行为,那么它就可以自由这样做。最明显的例子是,如果在基类中包含某些(成员函数或数据),但实际上从未使用过。
Derived
标记为final
,否则我认为编译器无法将 as-if 规则应用于其类布局。除此之外,未来调用者的集合也是一个开放集合。 - TemplateRex是的,它们是。
当派生类对象正在构造时,它所有的基类也会先被构造。
考虑以下示例:
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)
{
}
};