-1

基本クラス foo があるとします。

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

  protected:
   int child;
}

今、私は子クラスのバーを持っています:

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

バーにはデータ メンバーの子がありますか? もしそうなら、それは n に初期化されていますか?

4

4 に答える 4

0

はいといいえ。継承とは、 abarが afooに加えて、もう少し多いことを意味します。あなたの場合、その「ビット」はのコンストラクターにすぎませんbar。C++ では、その継承は、 abarが type のサブオブジェクトを含むような方法で実装されfooます。そして、そのサブオブジェクトには があるchildため、bar 間接的に にもそれchildがあります。とコンストラクターのみが直接含まれています。コンストラクターでサブオブジェクトfooを初期化し、それがその を初期化するため、コンストラクターは実際に を間接的に初期化します。foochildbarchild

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 が出力されていることがわかります。

ここで質問しているのは、オブジェクト指向の核心であり、公開継承は is-a 関係です。つまり、あなたのbaris-a はfoo、bar オブジェクトがすべての foos メンバーを運ぶことも意味します。

fooもちろん、これはすべてのs メンバーにアクセスできるという意味ではありません。クラスのpublicandセクションを使用しました。protectedただし、セクションにあるすべてのメンバーは、privateそのサブクラスからでもアクセスできません。これは通常、基本クラスのユーザーに対して実装の詳細を隠すために行われます。

スーパー クラス コンストラクターを呼び出すときに観察したように、基本オブジェクト メンバーを初期化します。

于 2013-04-12T05:55:49.680 に答える
0

答えは両方の質問にイエスです。bar は foo であるため、foo が持つすべてのメンバーを持ちます。bar のコンストラクターは foo のコンストラクターを呼び出し、子の値を設定します。

于 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 に答える