QUESTION 2 #include using namespace std; class ILogic{ public: virtual long Compute(long input1, long input2) = 0; }; class XOR :public ILogic{ public: long Compute(long input1, long input2){ return input1 ^ input2; } }; class NOR :public ILogic{ public: long Compute(long input1, long input2){ return ~(input1 | input2); } }; class NAND :public ILogic{ public: long Compute(long input1, long input2){ return ~(input1 & input2); } }; class Logic{ ILogic *m_pObject; long m_Input1, m_Input2; public: void SetAttributes(long in1, long in2){ m_Input1 = in1; m_Input2 = in2; } void SetLogicObject(ILogic *pObject){ m_pObject = pObject; } void ComputeLogic(long &result){ result = m_pObject->Compute(m_Input1, m_Input2); } }; // Note: Implement parts (a) & (b) as per the requirements of QUESTION_2. int main() { int type; long in1, in2, result; ILogic *a = NULL; Logic b; while(1){ cout << "Specify a logic operation" << endl << "(0 --> XOR, 1 --> NOR, 2 --> NAND, -1 --> exit): "; cin >> type; if (type == -1){ cout << endl << "Program terminated." << endl; return 0; } if (type == 0 || type == 1 || type == 2){ cout << endl << "Enter two integer logic inputs: "; cin >> in1 >> in2; if (type == 0){ a = new XOR; b.SetAttributes(in1, in2); b.SetLogicObject(a); b.ComputeLogic(result); } else if (type == 1){ a = new NOR; b.SetAttributes(in1, in2); b.SetLogicObject(a); b.ComputeLogic(result); } else if (type == 2){ a = new NAND; b.SetAttributes(in1, in2); b.SetLogicObject(a); b.ComputeLogic(result); } cout << endl << "Output: " << result << endl << endl; } else cout << endl << "Invalid Input" << endl << endl; } return 0; }