基本クラス foo があるとします。
class foo {
foo(int n) : child(n) {};
protected:
int child;
}
今、私は子クラスのバーを持っています:
class bar : public foo {
bar(int n) : foo(n) { }
}
バーにはデータ メンバーの子がありますか? もしそうなら、それは n に初期化されていますか?
はいといいえ。継承とは、 abar
が afoo
に加えて、もう少し多いことを意味します。あなたの場合、その「ビット」はのコンストラクターにすぎませんbar
。C++ では、その継承は、 abar
が type のサブオブジェクトを含むような方法で実装され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 が出力されていることがわかります。
ここで質問しているのは、オブジェクト指向の核心であり、公開継承は is-a 関係です。つまり、あなたのbar
is-a はfoo
、bar オブジェクトがすべての foos メンバーを運ぶことも意味します。
foo
もちろん、これはすべてのs メンバーにアクセスできるという意味ではありません。クラスのpublic
andセクションを使用しました。protected
ただし、セクションにあるすべてのメンバーは、private
そのサブクラスからでもアクセスできません。これは通常、基本クラスのユーザーに対して実装の詳細を隠すために行われます。
スーパー クラス コンストラクターを呼び出すときに観察したように、基本オブジェクト メンバーを初期化します。
答えは両方の質問にイエスです。bar は foo であるため、foo が持つすべてのメンバーを持ちます。bar のコンストラクターは foo のコンストラクターを呼び出し、子の値を設定します。
例: bar bobj(10);
have があり、この場合child
は say で初期化されます。10
bar のコンストラクターは foo のコンストラクターを呼び出して n を渡し、次に foo のコンストラクターは変数を で初期化しますn
。
継承とは、基本クラスが派生クラスに持つものすべてを意味します。オブジェクトが作成されたときのデータ メンバー。オブジェクト、static
静的メソッド、非静的メソッド。
C++ で新しい型を定義するときは、型が持つべきデータ、そのデータに対して許可される操作、および型とそのデータを構築する方法を定義します。
継承は、別の型に基づいて型を作成する必要がある場合に役立ちます。