假设我有一个基类 foo:
class foo {
foo(int n) : child(n) {};
protected:
int child;
}
现在我有一个子类吧:
class bar : public foo {
bar(int n) : foo(n) { }
}
bar 是否有数据成员 child?如果是,它是否被初始化为 n?
是和不是。继承意味着 abar
是 a foo
,可能还有更多。在您的情况下,该“位”只是bar
. 在 C++ 中,继承以 abar
包含类型的子对象的方式实现foo
。并且由于该子对象具有child
,因此也bar
间接具有该子对象child
。它直接只包含一个foo
和一个构造函数。由于您foo
在构造函数中初始化了子对象,然后又初始化了它child
,因此bar
构造函数确实child
间接初始化了。
除了访问修饰符,您可以child
通过以下方式轻松访问它bar
:
bar b;
b.child = 5;
但由于child
在 中受保护foo
,您无法从外部访问它,但您可以从bar
的方法中访问:
class bar : public foo {
bar(int n) : foo(n) { }
void baz() { child = 42; } //this is allowed.
}
简单的答案是肯定的,这很容易检查。
如果你说:
class bar : public foo {
bar(int n) : foo(n) { }
print_child() {std::cout << child << std::endl;}
}
int main() {
bar test(5);
test.print_child();
return 0;
}
你会看到它打印出 5。
你在这里问的是OO的一些核心,公共继承是一种关系。这意味着这意味着您的bar
is-afoo
也意味着 bar 对象将携带所有 foos 成员。
这当然并不意味着您可以访问所有foo
s 成员。您已经使用了该类的public
andprotected
部分。private
但是即使是其子类也无法访问该部分中的所有成员。这通常是为了隐藏基类用户的实现细节。
正如您在以初始化基对象成员的方式调用超类构造函数时所观察到的那样。
这两个问题的答案都是肯定的。bar 是一个 foo ,因此具有 foo 的所有成员。bar 的构造函数调用 foo 的构造函数并为 child 设置值。
例如:bar bobj(10);
将 have并且在这种情况下child
将使用 say 初始化。10
bar 的构造函数将调用 foo 的构造函数并传递 n,然后 foo 的构造函数将使用 初始化变量n
。
继承意味着基类具有派生类具有的任何内容。创建对象时的数据成员。以及static
对象、静态方法和非静态方法。
当您在 C++ 中定义新类型时,您将定义该类型应具有哪些数据、应允许对该数据进行哪些操作以及应如何构造该类型及其数据。
当必须基于另一种类型创建类型时,继承将有所帮助。