#include using namespace std; class Variable { protected: bool fiction; public: Variable() { fiction = false; } Variable(Variable * v1) { } virtual ~Variable() { cout<<"PYSH!!!!111"<Copy(this); (* op1)->SetFiction(true); (* op2) = p2; } } void CheckFiction(Variable * op2) { if (op2->fiction) delete op2; } public: virtual void Add(Variable * op1) { }; virtual void Sub(Variable * op1) { }; virtual void Mul(Variable * op1) { }; virtual void Div(Variable * op1) { }; Variable & operator+(Variable & p1) { Variable * op1 = NULL, * op2 = NULL; ChooseOperands(&p1, &op1, &op2); op1->Add(op2); CheckFiction(op2); return (* op1); } Variable & operator-(Variable & p1) { Variable * op1 = NULL, * op2 = NULL; ChooseOperands(&p1, &op1, &op2); op1->Sub(op2); CheckFiction(op2); return (* op1); } Variable & operator*(Variable & p1) { Variable * op1 = NULL, * op2 = NULL; ChooseOperands(&p1, &op1, &op2); op1->Mul(op2); CheckFiction(op2); return (* op1); } Variable & operator/(Variable & p1) { Variable * op1 = NULL, * op2 = NULL; ChooseOperands(&p1, &op1, &op2); op1->Div(op2); CheckFiction(op2); return (* op1); } Variable & operator=(Variable & p1) { Copy(&p1); CheckFiction(&p1); return (* this); } }; class Integer: public Variable { public: int value; Integer() { value = 0; } Integer(int nv) { value = nv; } Integer(Integer * v1) { value = v1->value; } virtual ~Integer() { cout<<"2PYSH!!!!111"<value; return this; } virtual void Add(Variable * op1) { value += ((Integer *) op1)->value; } virtual void Sub(Variable * op1) { value -= ((Integer *) op1)->value; } virtual void Mul(Variable * op1) { value *= ((Integer *) op1)->value; } virtual void Div(Variable * op1) { value /= ((Integer *) op1)->value; } Integer & operator=(Variable & p1) { Variable::operator=(p1); return (* this); } }; class Complex: public Variable { protected: double a; double b; public: Complex() { a = 0; b = 0; } Complex(double na, double nb) { a = na; b = nb; } Complex(Complex * v1) { a = v1->a; b = v1->b; } virtual ~Complex() { } virtual Complex * Create() { return new Complex(); } virtual Complex * Copy(Variable * v) { a = ((Complex *) v)->a; b = ((Complex *) v)->b; return this; } virtual void Add(Variable * op1) { a += ((Complex *) op1)->a; b += ((Complex *) op1)->b; cout << "a: " << a << endl << "b: " << b << endl; } virtual void Sub(Variable * op1) { a -= ((Complex *) op1)->a; b -= ((Complex *) op1)->b; cout << "a: " << a << endl << "b: " << b << endl; } virtual void Mul(Variable * op1) { double a1 = a, b1 = b, a2 = ((Complex *) op1)->a, b2 = ((Complex *) op1)->b; a = (a1 * a2) - (b1 * b2); b = (a1 * b2) + (b1 * a2); cout << "a: " << a << endl << "b: " << b << endl; } virtual void Div(Variable * op1) { double a1 = a, b1 = b, a2 = ((Complex *) op1)->a, b2 = ((Complex *) op1)->b; double d = (a2*a2 + b2*b2); a = (a1*a2 + b1*b2) / d; b = (a1*b2 + b1*a2) / d; cout << "a: " << a << endl << "b: " << b << endl; } Complex & operator=(Variable & p1) { Variable::operator=(p1); Complex * p2 = (Complex *) &p1; cout << "a: " << p2->GetA() << endl << "b: " << p2->GetB() << endl; return (* this); } double GetA() { return a; } double GetB() { return b; } void SetA(double na) { a = na; } void SetB(double nb) { b = nb; } void SetAB(double na, double nb) { a = na; b = nb; } }; int main() { Complex v1(1,2), v2(3,4), v3(6,7), v4(8,2); Complex v5; v5 = ((v1 + v2) * (v3 - v4)); cout << v5.GetA() << endl <