【发布时间】:2013-10-23 14:50:01
【问题描述】:
所以基类中的private 成员也在继承类中,但不能在其中访问,对吧?
它们实际上是否在分配给继承对象的内存中?
【问题讨论】:
-
继承是
is-a关系,所以是的,基类需要的所有内存都需要在子类中。
标签: c++ inheritance access-modifiers
所以基类中的private 成员也在继承类中,但不能在其中访问,对吧?
它们实际上是否在分配给继承对象的内存中?
【问题讨论】:
is-a 关系,所以是的,基类需要的所有内存都需要在子类中。
标签: c++ inheritance access-modifiers
它们实际上是否在分配给继承对象的内存中?
是的,它们需要存在。私有成员是基类实现细节的一部分。没有它们,一般来说,基类将无法运行(这就是它们最初存在的原因)。
将它们设为私有只允许基类根据自己的选择创建其实现,而不会将其暴露给任何人,包括子类。
【讨论】:
是的。例如,您可以使用基类中的公共函数来操作私有数据,即使在派生类的实例中也是如此:
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”规则——如果编译器可以确定它可以以某种方式为程序产生正确的可观察行为,即使不包括基类,那么它是免费的。最明显的例子是,如果您在基类中包含一些在实践中根本没有使用过的东西(成员函数或数据)。
【讨论】:
Derived 被标记为final,否则我认为编译器永远无法将as-if 规则应用于其类布局。最重要的是,未来调用者的集合也是一个开放集。
是的,他们是,
当派生类的对象被构造时,它的所有基类也首先被构造。
考虑这个例子:
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(构造函数被调用)。
【讨论】: