//设计一个数字抽象类,可以显示3中数字类型(整数,实数,复数)
//RealNumber,完成实数运算和现实。
//IntegerNumber,完成实数运算和现实。
//ComplexNumber,完成复数运算和现实。
//在主函数测试中使用多态方式显示不同数字对象。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

//创建一个数字基类
class Number
{
public:
    Number(){}
    ~Number(){}
    virtual void print(){}
};

// 实数类型
class RealNumber :public Number
{
private:
    double value; // 小数值
public:
    RealNumber(double a = 0) :value(a){}
    ~RealNumber(){}
    virtual void print();
    RealNumber add(const RealNumber& other);
    RealNumber mul(const RealNumber& other);
};

// 整数类型
class IntegerNumber :public RealNumber
{
private:
    int value; // 整数值
public:
    IntegerNumber(int a = 0) :value(a){}
    ~IntegerNumber(){}
    virtual void print();
    IntegerNumber add(const IntegerNumber& other);
    IntegerNumber mul(const IntegerNumber& other);
};

// 复数类型
class ComplexNumber :public Number
{
private:
    double a;// 实部
    double b;// 虚部
public:
    ComplexNumber(double aa = 0, double bb = 0) :a(aa), b(bb){}
    ~ComplexNumber(){}
    virtual void print();
    ComplexNumber add(const ComplexNumber& other);
    ComplexNumber mul(const ComplexNumber& other);
};

// -----------RealNumber函数实现-------------
void RealNumber::print()
{
    cout << value << endl;
}

RealNumber RealNumber::add(const RealNumber& other)
{
    return (value + other.value);
}

RealNumber RealNumber::mul(const RealNumber& other)
{
    return RealNumber(value*other.value);
}

// -----------IntegerNumber函数实现-------------
void IntegerNumber::print()
{
    cout << value << endl;
}

IntegerNumber IntegerNumber::add(const IntegerNumber& other)
{
    return IntegerNumber(value + other.value);
}

IntegerNumber IntegerNumber::mul(const IntegerNumber& other)
{
    return IntegerNumber(value*other.value);
}

// -----------ComplexNumber函数实现-------------
void ComplexNumber::print()
{
    cout << a << "+" << b << "i" << endl;
}

ComplexNumber ComplexNumber::add(const ComplexNumber& other)
{
    return ComplexNumber(a + other.a, b + other.b);
}

ComplexNumber ComplexNumber::mul(const ComplexNumber& other)
{
    return ComplexNumber(a*other.a - b*other.b, a*other.b + b*other.a);
}

//打印输出
int main(void)
{
    // 构造数字
    RealNumber theone(9.99999);
    RealNumber thenext(8.88888);
    ComplexNumber one(5, 6);
    ComplexNumber two(3, 4);

    //打印输出
    Number* result = new RealNumber(theone.add(thenext));
    result->print();
    Number* product = new ComplexNumber(one.mul(two));
    product->print();

    delete result, product;

    // 暂停
    system("pause");
    return EXIT_SUCCESS;
}