基本クラス 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を初期化し、それがその を初期化するため、コンストラクターは実際に を間接的に初期化します。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.
}
簡単な答えは「はい」です。これは非常に簡単に確認できます。
あなたが言うなら:
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そのサブクラスからでもアクセスできません。これは通常、基本クラスのユーザーに対して実装の詳細を隠すために行われます。
スーパー クラス コンストラクターを呼び出すときに観察したように、基本オブジェクト メンバーを初期化します。
答えは両方の質問にイエスです。bar は foo であるため、foo が持つすべてのメンバーを持ちます。bar のコンストラクターは foo のコンストラクターを呼び出し、子の値を設定します。
例: bar bobj(10);have があり、この場合childは say で初期化されます。10
bar のコンストラクターは foo のコンストラクターを呼び出して n を渡し、次に foo のコンストラクターは変数を で初期化しますn。
継承とは、基本クラスが派生クラスに持つものすべてを意味します。オブジェクトが作成されたときのデータ メンバー。オブジェクト、static静的メソッド、非静的メソッド。
C++ で新しい型を定義するときは、型が持つべきデータ、そのデータに対して許可される操作、および型とそのデータを構築する方法を定義します。
継承は、別の型に基づいて型を作成する必要がある場合に役立ちます。