継承

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