今回もマークダウン記法の練習を兼ねて、投稿してみます。(私事ですがプライベートが少々忙しく、ある程度記事が書けるのは2月以降になりそうです)
題材として、独習C++の第3章の章末確認問題の3.を解いてみます。
クラスを継承して新しいクラスを作り、派生クラスのインスタンスを2つ作ります。基本クラスと派生クラス両方にメンバ変数が含まれていて、片方のインスタンスでは両方の変数を初期化します。ここで初期化していないインスタンスに初期化したインスタンスを代入すると、どこまでデータがコピーされるのでしょうか。基本クラスのデータまでコピーされるのでしょうか。
まず基本クラスと派生クラスを記述します。
class base {
int a;
public:
void load_a(int n){a = n;}
int get_a(){return a;}
};
class derived : public base{
int b;
public:
void load_b(int n){b = n;}
int get_b(){return b;}
};
次にmain関数内で、次の命令を実行してみます。
derived i1,i2;
i1.load_a(100);
i1.load_b(200);
cout << "i1のaは" << i1.get_a() << " i1のbは" << i1.get_b() << "\n";
i2 = i1;
cout << "i2のaは" << i2.get_a() << " i2のbは" << i2.get_b() << "\n";
すると、以下の結果を得ました。
i1のaは100 i1のbは200
i2のaは100 i2のbは200
基本クラスのデータまでちゃんとコピーされているようです。継承がもっと深くなっても同じことがいえるでしょうか?
次の派生クラスを追加します。
class derived2 : public derived{
int c;
public:
void load_c(int n){c = n;}
int get_c(){return c;}
};
同じようにmain関数内で次を実行します。
derived2 i1,i2;
i1.load_a(100);
i1.load_b(200);
i1.load_c(300);
cout << "i1のaは" << i1.get_a() << " i1のbは" << i1.get_b() << " i1のcは" << i1.get_c() << "\n";
i2 = i1;
cout << "i2のaは" << i2.get_a() << " i2のbは" << i2.get_b() << " i2のcは" << i2.get_c() << "\n";
結果は以下のようでした。
i1のaは100 i1のbは200 i1のcは300
i2のaは100 i2のbは200 i2のcは300
どうやら、継承が深くなっても、大元の基本クラスのデータまでコピーされるようです。
簡単ですが、今回はここまでにしたいと思います。お読みいただいてありがとうございました。