派生类是否包含其基类的成员变量?

时间:2013-04-12 05:53:14

标签: c++ oop

假设我有一个基类foo:

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

  protected:
   int child;
}

现在我有一个儿童班吧:

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

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

4 个答案:

答案 0 :(得分: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的一些核心,公共继承是一种关系。这意味着这意味着您的bar是一个foo,这也意味着条形对象将携带所有foos成员。

这当然并不意味着您可以访问所有foo个成员。您已使用该课程的publicprotected部分。但是private部分中的所有成员甚至不能通过其子类访问。通常这样做是为了隐藏基类用户的实现细节。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

继承是指派生类具有的基类。创建对象时的数据成员。以及static对象,静态方法和非静态方法。

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

当必须根据其他类型创建on类型时,继承将有所帮助。

答案 3 :(得分:0)

是和否。继承意味着,barfoo,加上可能更多一点。在您的情况下,“bit”只是bar的构造函数。在C ++中,继承是以bar包含类型为foo的子对象的方式实现的。由于该子对象具有childbar 间接也具有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.
}