001 /****************************/
002 /* 派生クラス */
003 /* coded by Y.Suganuma */
004 /****************************/
005 #include <iostream>
006
007 /********************/
008 /* クラスOya1の定義 */
009 /********************/
010 class Oya1 {
011 int priv1;
012 protected:
013 int prot1;
014 public:
015 int pub1;
016 Oya1 (int n1, int n2, int n3) // コンストラクタ
017 {
018 priv1 = n1;
019 prot1 = n2;
020 pub1 = n3;
021 }
022 void output1(int sw) // 出力
023 {
024 switch (sw) {
025 case 0:
026 std::cout << " priv1 " << priv1 << std::endl;
027 break;
028 case 1:
029 std::cout << " prot1 " << prot1 << std::endl;
030 break;
031 case 2:
032 std::cout << " pub1 " << pub1 << std::endl;
033 break;
034 }
035 }
036 };
037
038 /********************/
039 /* クラスOya2の定義 */
040 /********************/
041 class Oya2 {
042 int priv2;
043 public:
044 int pub2_1, pub2_2;
045 void set(int sw, int n) // 値の設定
046 {
047 switch (sw) {
048 case 0:
049 priv2 = n;
050 break;
051 case 1:
052 pub2_1 = n;
053 break;
054 case 2:
055 pub2_2 = n;
056 break;
057 }
058 }
059 void output2(int sw) // 出力
060 {
061 switch (sw) {
062 case 0:
063 std::cout << " priv2 " << priv2 << std::endl;
064 break;
065 case 1:
066 std::cout << " pub2_1 " << pub2_1 << std::endl;
067 break;
068 case 2:
069 std::cout << " pub2_2 " << pub2_2 << std::endl;
070 break;
071 }
072 }
073 };
074
075 /**********************/
076 /* クラスkodomoの定義 */
077 /**********************/
078 class Kodomo : public Oya1, Oya2 {
079 public:
080 // コンストラクタ(基底クラスのコンストラクタのために必要)
081 Kodomo (int n1, int n2, int n3) : Oya1(n1, n2, n3) {}
082 void output_k(int sw) // 出力
083 {
084 switch (sw) {
085 case 0: // 親のprivate変数にはアクセスできない
086 std::cout << " priv1 ?" << std::endl;
087 break;
088 case 1:
089 std::cout << " prot1 " << prot1 << std::endl;
090 break;
091 case 2:
092 std::cout << " pub1 " << pub1 << std::endl;
093 break;
094 case 3: // 親のprivate変数にはアクセスできない
095 std::cout << " priv2 ?" << std::endl;
096 break;
097 case 4:
098 std::cout << " pub2_1 " << pub2_1 << std::endl;
099 break;
100 case 5:
101 std::cout << " pub2_2 " << pub2_2 << std::endl;
102 break;
103 }
104 }
105 // Oya2のpublic変数の一部と関数をpubulicに移動
106 Oya2::pub2_1;
107 Oya2::set;
108 Oya2::output2;
109 };
110
111 /******************/
112 /* mainプログラム */
113 /******************/
114 int main()
115 {
116 // 親1
117 Oya1 o1(10, 20, 30);
118
119 std::cout << "親1\n";
120 o1.output1(0); // priv1 の出力
121 o1.output1(1); // prot1 の出力
122 o1.output1(2); // pub1 の出力
123 std::cout << " (from main) priv1 ? prot1 ? pub1 " << o1.pub1 << std::endl;
124 // 親2
125 Oya2 o2;
126
127 std::cout << "親2\n";
128 o2.set(0, 50);
129 o2.set(1, 60);
130 o2.set(2, 70);
131 o2.output2(0); // priv2 の出力
132 o2.output2(1); // pub2_1 の出力
133 o2.output2(2); // pub2_2 の出力
134 std::cout << " (from main) priv2 ? pub2_1 " << o2.pub2_1 << " pub2_2 " << o2.pub2_2 << std::endl;
135 // 子供
136 Kodomo k(100, 200, 300); // 親(Oya1)のコンストラクタのための引数
137
138 std::cout << "子供\n";
139 // Oya1から継承した部分
140 std::cout << " Oya1から継承した関数を利用\n";
141 k.output1(0); // Oya1から継承した priv1 の出力
142 k.output1(1); // Oya1から継承した prot1 の出力
143 k.output1(2); // Oya1から継承した pub1 の出力
144 std::cout << " Kodomoの関数を利用\n";
145 k.output_k(0); // Oya1から継承した priv1 の出力(不可能)
146 k.output_k(1); // Oya1から継承した prot1 の出力
147 k.output_k(2); // Oya1から継承した pub1 の出力
148 std::cout << " (from main) priv1 ? prot1 ? pub1 " << k.pub1 << std::endl;
// pub1 はパブリック部分に継承されるためmainから参照可能
149 // Oya2から継承した部分
150 std::cout << " Oya2から継承した関数を利用\n";
151 k.set(0, 500);
152 k.set(1, 600);
153 k.set(2, 700);
154 k.output2(0); // Oya2から継承した priv2 の出力
155 k.output2(1); // Oya2から継承した pub2_1 の出力
156 k.output2(2); // Oya2から継承した pub2_2 の出力
157 std::cout << " Kodomoの関数を利用\n";
158 k.output_k(3); // Oya2から継承した priv2 の出力(不可能)
159 k.output_k(4); // Oya2から継承した pub2_1 の出力
160 k.output_k(5); // Oya2から継承した pub2_2 の出力
161 std::cout << " (from main) priv2 ? pub2_1 " << k.pub2_1 << " pub2_2 ?" << std::endl;
// pub2_1 はパブリック部分に移動されたためmainから参照可能
162
163 return 0;
164 }