#include <iostream> using namespace std; class Num { public: string name; int vi; double vd; Num() { // コンストラクタ vi = 0; vd = 0.0; name = ""; } Num(int vi1) { // コンストラクタ vi = vi1; name = "数値"; } Num(double vd1) { // コンストラクタ vd = vd1; name = "数値"; } int add(int v) { int x = vi + v; return x; } double add(double v) { double x = vd + v; return x; } }; class Int : public Num { public: string name; int v; Int(int v1) { // コンストラクタ v = v1; name = "整数"; } }; class Complex : public Num { public: string name; double re, im; Complex() {} // コンストラクタ Complex(double re1, double im1 = 0.0) { // コンストラクタ re = re1; im = im1; name = "複素数"; } Complex add(Complex v) { Complex x; x.re = re + v.re; x.im = im + v.im; return x; } }; int main() { Int x = Int(10); // コンストラクタにより,Int クラスの変数 v に値が設定 cout << x.v << endl; // 10 Int y = x.add(20); // メンバー関数 add の継承 cout << y.v << endl; // 30 Complex u(1, 2); // Complex クラスのコンストラクタ cout << "(" << u.re << ", " << u.im << ")\n"; // (1, 2) Complex v(3); cout << "(" << v.re << ", " << v.im << ")\n"; // (3, 0) Complex w = u.add(v); // オーバーライドされたメンバー関数 add の利用 cout << "(" << w.re << ", " << w.im << ")\n"; // (4, 2) u.re = Num(u.re).add(10.0); // 基底クラスのメソッド add の利用(10ではだめ) cout << "(" << u.re << ", " << u.im << ")\n"; // (11, 2) cout << u.name << endl; // 複素数 cout << x.name << endl; // 整数 return 0; }