#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;
}