アフィリエイト広告を利用しています

広告

posted by fanblog

2017年12月29日

《その211》 多重継承 & p.244演習7-1


 多重継承

 次の3つのクラスがあるものとします。C は、2つの基底クラス A, B からの派生クラスです。
その結果、C は、2つの基底クラスの資産を継承することになります。このような継承の形を、多重継承と呼びます。

【クラス A】
  コンストラクタ … 「 A 」 を表示
  デストラクタ  … 「~A 」 を表示
  データメンバ x = 1
  メンバ関数 get_x() … x の値を返却

【クラス B】
  コンストラクタ … 「 B 」 を表示
  デストラクタ  … 「~B 」 を表示
  データメンバ x = 1
  メンバ関数 get_x() … x の値を返却

【クラス C】基底クラス A, B を多重継承
  コンストラクタ … 「 C 」 を表示
  デストラクタ  … 「~C 」 を表示
  データメンバ x = 1
  メンバ関数 get_x() … x の値を返却


 次のプログラムの結果から、コンストラクタが呼び出される順序と、デストラクタが呼び出される順序が確認できます。

 また、クラス C は、
  基底クラス部分オブジェクト A のデータメンバ x
  基底クラス部分オブジェクト B のデータメンバ x
  派生クラス C のデータメンバ x
の3つの x を保持することになります。
これらに、get_x関数でアクセスする際には、
  c.A::get_x();
  c.B::get_x();
  c.get_x();

のように、明確な指定が必要になります。

// ---------------------------
#include <iostream>
using namespace std;

class A {
protected:
int x;
public:
A() { cout << "A" << '\n'; x = 1; }
~A() { cout << "~A" << '\n'; }
int get_x() const { return x; }
};


class B {
protected:
int x;
public:
B() { cout << "B" << '\n'; x = 2; }
~B() { cout << "~B" << '\n'; }
int get_x() const { return x; }
};


class C : public A, public B {
protected:
int x;
public:
C() { cout << "C" << '\n'; x = 3; }
~C() { cout << "~C" << '\n'; }
int get_x() const { return x; }
};


int main() {
A a;
cout << "------\n";
B b;
cout << "------\n";
C c;
cout << "------\n";
cout << c.A::get_x() << ' '
<< c.B::get_x() << ' '
<< c.get_x() << '\n';
cout << "------\n";
}
// ------------------------------------

f07_0001.png



新版明解C++中級編 p.244 演習7-1
 以下のクラス群のクラス階層図を描き、クラス Z型のオブジェクトを初期化する際の基底クラス部分オブジェクトの初期化の順序を示せ。
  class A{ /* ・・・・・・ */ };
  class B{ /* ・・・・・・ */ };
  class X : A, B{ /* ・・・・・・ */ };
  class Y : B, A{ /* ・・・・・・ */ };
  class Z : X, Y{ /* ・・・・・・ */ };

※アクセス指定子 public, protected, private が記述されていない場合は、private派生と解釈されます。

クラス階層図
f07_0002.png


 Z型のオブジェクトを初期化する際の規定クラス部分オブジェクトの初期化の順序は、次のプログラムの出力結果の2本の "------"線の間で確認できます。

// ---------------------------
#include <iostream>

class A {
public:
A() { std::cout << "A" << '\n'; }
};

class B {
public:
B() { std::cout << "B" << '\n'; }
};

class X : A, B {
public:
X() { std::cout << "X" << '\n'; }
};

class Y : B, A {
public:
Y() { std::cout << "Y" << '\n'; }
};

class Z : X, Y {
public:
Z() { std::cout << "Z" << '\n'; }
};


int main() {
A a;
B b;
X x;
Y y;
std::cout << "\nZ型のオブジェクトを初期化"
"する際の \n規定クラス部分オ"
"ブジェクトの初期化の順序 \n"
"↓\n------\n";
Z z;
std::cout << "------\n";
}
// ------------------------------------

f07_000302.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:13時点)

新版 明解C 中級編 (明解シリーズ)

新品価格
¥2,916から
(2017/11/10 13:14時点)





この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7140704
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。