-1

假设我有一个基类 foo:

class foo {
   foo(int n) : child(n) {};

  protected:
   int child;
}

现在我有一个子类吧:

class bar : public foo {
  bar(int n) : foo(n) { }
}

bar 是否有数据成员 child?如果是,它是否被初始化为 n?

4

4 回答 4

0

是和不是。继承意味着 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.
}
于 2013-04-12T06:00:55.183 回答
0

简单的答案是肯定的,这很容易检查。

如果你说:

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的一些核心,公共继承是一种关系。这意味着这意味着您的baris-afoo也意味着 bar 对象将携带所有 foos 成员。

这当然并不意味着您可以访问所有foos 成员。您已经使用了该类的publicandprotected部分。private但是即使是其子类也无法访问该部分中的所有成员。这通常是为了隐藏基类用户的实现细节。

正如您在以初始化基对象成员的方式调用超类构造函数时所观察到的那样。

于 2013-04-12T05:55:49.680 回答
0

这两个问题的答案都是肯定的。bar 是一个 foo ,因此具有 foo 的所有成员。bar 的构造函数调用 foo 的构造函数并为 child 设置值。

于 2013-04-12T05:55:52.053 回答
0

例如:bar bobj(10);将 have并且在这种情况下child将使用 say 初始化。10

bar 的构造函数将调用 foo 的构造函数并传递 n,然后 foo 的构造函数将使用 初始化变量n

继承意味着基类具有派生类具有的任何内容。创建对象时的数据成员。以及static对象、静态方法和非静态方法。

当您在 C++ 中定义新类型时,您将定义该类型应具有哪些数据、应允许对该数据进行哪些操作以及应如何构造该类型及其数据。

当必须基于另一种类型创建类型时,继承将有所帮助。

于 2013-04-12T05:56:06.327 回答