Please the following is the currency class of perious one. class Currency { protected: int whole; int fraction; virtual std::string get_name() = 0; public: Currency() { whole = 0; fraction = 0; } Currency(double value) { if (value < 0) throw "Invalid value"; whole = int(value); fraction = std::round(100 * (value - whole)); } Currency(const Currency& curr) { whole = curr.whole; fraction = curr.fraction; } /* This algorithm gets the whole part or fractional part of the currency Pre: whole, fraction - integer numbers Post: Return: whole or fraction */ int get_whole() { return whole; } int get_fraction() { return fraction; } /* This algorithm adds an object to the same currency Pre: object (same currency) Post: Return: */ void set_whole(int w) { if (w >= 0) whole = w; } void set_fraction(int f) { if (f >= 0 && f < 100) fraction = f; } /* This algorithm adds an object to the same currency Pre: object (same currency) Post: Return: */ void add(const Currency* curr) { whole += curr->whole; fraction += curr->fraction; if (fraction > 100) { whole++; fraction %= 100; } } /* This algorithm subtracts an object to the same currency Pre: object (same currency) Post: Return: */ void subtract(const Currency* curr) { if (!isGreater(*curr)) throw "Invalid Subtraction"; whole -= curr->whole; if (fraction < curr->fraction) { fraction = fraction + 100 - curr->fraction; whole--; } else { fraction -= curr->fraction; } } /* This algorithm compares the an object of the same currency for equality or inequality Pre: object (same currency) Post: Return: whole/fraction */ bool isEqual(const Currency& curr) { return curr.whole == whole && curr.fraction == fraction; } /* This algorithm compares the an object of the same currency to determine which is greater or smaller Pre: object (same currency) Post: Return: true/false */ bool isGreater(const Currency& curr) { if (whole < curr.whole) return false; if (whole == curr.whole && fraction < curr.fraction) return false; return true; } /* This algorithm prints the name and value of the currency object Pre: value of whole, fraction, and the name Post: whole, fraction, get_name() Return: */ void print() { std::cout << whole << "." << fraction << " " << get_name() << std::endl; } }; class Krone : public Currency { protected: /* This algorithm gets the name for the Currency. Pre: name - declared as string and initialized as Krone Post: Return: name */ std::string name = "Krone"; std::string get_name() { return name; } public: Krone() : Currency() { } Krone(double value) : Currency(value) { } Krone(Krone& curr) : Currency(curr) { } }; class Soum : public Currency { protected: /* This algorithm gets the name for the Currency. Pre: name - declared as string and initialized as Soum Post: Return: name */ std::string name = "Soum"; std::string get_name() { return name; } public: Soum() : Currency() { } Soum(double value) : Currency(value) { } Soum(Krone& curr) : Currency(curr) { } }; A LinkNode structure or class which will have two attrib.