To implement the BasePlusCommissionEmp class using composition instead of inheritance and invoke different functions in the test program subsequently.
Explanation of Solution
Program:
// BasePlusCommissionEmp class definition . #ifndef BP_COMMISSION_H #define BP_COMMISSION_H #include<string>// C++ standard string class usingnamespacestd; classBasePlusCommissionEmp { public: BasePlusCommissionEmp(conststring&, conststring&, conststring&, double = 0.0,double = 0.0, double = 0.0 ); //For generic attributes of Employee voidsetFirstName( conststring& ); // set first name stringgetFirstName() const; // return first name voidsetLastName( conststring& ); // set last name stringgetLastName() const; // return last name voidsetSocialSecurityNumber( conststring& ); // set SSN stringgetSocialSecurityNumber() const; // return SSN // additional functions for attributes of CommisionEmployee voidsetGrossSales( double ); // set gross sales amount doublegetGrossSales() const; // return gross sales amount voidsetCommissionRate( double ); // set commission rate doublegetCommissionRate() const; // return commission rate //additional functions for baseSalary voidsetBaseSalary( double ); // set base salary doublegetBaseSalary() const; // return base salary // Generic functions of Employee doubleearnings() const; voidprint() const; private: //Generic attributes of Employee stringfirstName; // composition: member object stringlastName; // composition: member object stringsocialSecurityNumber; //composition: member object //attributes of CommisionEmployee doublegrossSales; // gross weekly sales doublecommissionRate; // commission percentage //attribute for BaseSalary doublebaseSalary; // base salary }; // end class BasePlusCommissionEmp #endif //BasePlusCommisionEmp.cpp /* BasePlusCommissionEmp.cpp using composition Created on: 31-Jul-2018 :rajesh@acroknacks.com */ #include<string>// C++ standard string class #include"BasePlusCommissionEmp.h" #include<iostream> usingnamespacestd; BasePlusCommissionEmp::BasePlusCommissionEmp(conststring&fname, conststring&lname, conststring&ssn1, doublebaseSalary, doublegrossSales , doublecomRate ) :firstName (fname), lastName ( lname),socialSecurityNumber (ssn1 ) { setBaseSalary(baseSalary ); // validate and store base salary setGrossSales(grossSales);//validate and store gross sales setCommissionRate(comRate);//validate and store commision rate }// end constructor /&Functions Below are specific to This class */ // set gross sales amount voidBasePlusCommissionEmp::setGrossSales( double sales ) { if ( sales **gt;= 0.0 ) grossSales = sales; else throwinvalid_argument( "Gross sales must be >= 0.0" ); } // end function setGrossSales // return gross sales amount doubleBasePlusCommissionEmp::getGrossSales() const { returngrossSales; } // end function getGrossSales // set commission rate voidBasePlusCommissionEmp::setCommissionRate( double rate ) { if ( rate > 0.0 && rate < 1.0 ) commissionRate = rate; else throwinvalid_argument( "Commission rate must be > 0.0 and < 1.0" ); } // end function setCommissionRate doubleBasePlusCommissionEmp::getCommissionRate() const { returncommissionRate; } // end function getCommissionRate voidBasePlusCommissionEmp::setBaseSalary( double salary ) { if ( salary >= 0.0 ) baseSalary = salary; else throwinvalid_argument( "Salary must be >= 0.0" ); } // end function setBaseSalary // return base salary doubleBasePlusCommissionEmp::getBaseSalary() const { returnbaseSalary; } // end function getBaseSalary //compute earnings doubleBasePlusCommissionEmp::earnings() const { return ( (getCommissionRate() * getGrossSales()) + getBaseSalary()) ; } // end function earnings // print CommissionEmployee object voidBasePlusCommissionEmp::print() const { cout<<"\nBasePlusCommission employee: "; cout<<lastName<<", "<<firstName<<endl; cout<<"SSN : "<<socialSecurityNumber<<endl; cout<<"\n gross sales: $ "<<getGrossSales() <<"\n Base Salary: $ "<<getBaseSalary() <<"\n commission rate: "<<getCommissionRate() ; } // end function print /&Generic Employee functions **/ // set first name voidBasePlusCommissionEmp::setFirstName( conststring**first ) { firstName = first; // should validate } // end function setFirstName // return first name stringBasePlusCommissionEmp::getFirstName() const { returnfirstName; } // end function getFirstName // set last name voidBasePlusCommissionEmp::setLastName( conststring&last ) { lastName = last; // should validate } // end function setLastName // return last name stringBasePlusCommissionEmp::getLastName() const { returnlastName; } // end function getLastName // set social security number voidBasePlusCommissionEmp::setSocialSecurityNumber( conststring&ssn ) { socialSecurityNumber = ssn; // should validate } // end function setSocialSecurityNumber // return social security number stringBasePlusCommissionEmp::getSocialSecurityNumber() const { returnsocialSecurityNumber; } // end function getSocialSecurityNumber
Test Program
// Testing class BasePlusCommissionEmp. #include<iostream> #include<iomanip> #include"BasePlusCommissionEmp.h"// BasePlusCommissionEmp class definition usingnamespacestd; intmain() { // instantiate a BasePlusCommissionEmp object BasePlusCommissionEmpemployee("Sue", "Jones", "222-22-2222",1500,10000,0.16 ); // get commission employee data cout<<"Employee information obtained by get functions: \n" <<"\nFirst name is "<<employee.getFirstName() <<"\nLast name is "<<employee.getLastName() <<"\nSocial security number is " <<employee.getSocialSecurityNumber() <<"\nBase Salary is $"<<employee.getBaseSalary() <<"\nGross sales is $"<<employee.getGrossSales() <<"\nCommission rate is $"<<employee.getCommissionRate() <<endl; cout<<"Earnings based on current Data : $"<<employee.earnings(); //Modify Sales data employee.setGrossSales( 8000 ); // set gross sales employee.setCommissionRate( .1 ); // set commission rate cout<<"\nUpdated employee information output by print function: \n" <<endl; employee.print(); // display the new employee information // display the employee's earnings cout<<"\n\n Updated Employee's earnings: $"<<employee.earnings() <<endl; } // end main
Explanation:
Theabove program demonstrates composition as an alternate way of implementing functionality in Object oriented
Composition increases duplicity of code as seen in BasePlusCommissionEmp class where a large part of attributes and functions of the Employee class have to be repeated in the BasePlusCommissionEmp class.
Also, the test code or the actual application using these objects becomes more complicated because the use of Data structures like
If there are a large number of objects with similar functionality and a little variances, the redundant code soon becomes prone to defect and maintenance nightmares. On the other hand, composition provides more control at the compile time by limiting common access modifier errors and method overriding errors during development time.
The has-a relationship is suited mostly where there is limited or no commonality in attributes and functionality of the objects being modelled.
It’s always better to create an is-a class hierarchy whenthe objects being modelled are having a lot of common attributes and method, resulting in a generic common subset (the base class) and other derived class specializing form it. Inheritance makes the code cleaner to write, read and maintain.
Sample Output:
Employee information obtained by get functions: First name is Sue Last name is Jones Social security number is 222-22-2222 Base Salary is $1500 Gross sales is $10000 Commission rate is $0.16 Earnings based on current Data : $3100 Updated employee information output by print function: BasePlusCommission employee: Jones, Sue SSN : 222-22-2222 gross sales: $ 8000 Base Salary: $ 1500 commission rate: 0.1 Updated Employee's earnings: $2300
Want to see more full solutions like this?
Chapter 19 Solutions
C How To Program Plus Mylab Programming With Pearson Etext -- Access Card Package (8th Edition)
- I need help in this question of true or False on the concepts of OOP URGENT. True or False a)Composition is a specific type of Inheritance. b)Composition is commonly known as the "is a" relationship, where one class is a specific type of another class. c)With Association, it is common to see one class being passed into another class' parameters. In this sense, the receiving class "uses" the passed class.arrow_forwardI need help Implement the operators for class Login and class Person. Please help me outarrow_forwardDiscuss the use of the default constructor that takes no arguments.arrow_forward
- What are some of the key differences between verifying types statically and checking types dynamically?arrow_forwardDifferentiate between abstract and concrete classes. Give examples from the scenario abovearrow_forwardExplain why it is preferable to have accessors to private types rather than making the types public, keeping in mind the three reasons that are given below.arrow_forward
- In C++, how does using pointers and references work in as parameters in a function of a class? It is used a lot, and I dont really know how to use this as parameter in a function of a class, or in Polymorphism as well.arrow_forwardC++ Using Card and Deck class created during the lecture or your own implementation that follows the spec for a card and deck, implement the following game: game is designed for a single player who is playing against the computeryou draw three cards for each player (player and a computer) Using the compare function from the Card class you compare each pair drawnIf the player's card is higher, the player gets a pointYou repeat this comparison 3 times (for each pair of cards you draw)The player wins if he gets more points than a computer (has more higher cards than the computer)arrow_forwardI need help with this question, which should be completed in C# programming language.(Non-other) Complete the Person (base), Student (derived), Faculty (derived), Admin (derived), Staff (derived) Classes Use the following properties: 1- Person properties - firstName, lastName, email (type string), Person method - PersonWrite 2- Student properties - studentID (private string), use a getter and setter, define 2 constructors Student method - StudentWrite 3- Faculty properties - facultyID (private string), use a getter and setter, define 2 constructors Faculty method - FacultyWrite 4- Admin properties - adminID (private string), use a getter and setter, define 2 constructors Admin method - AdminWrite 5- Staff properties - staffID (private string), use a getter and setter, define 2 constructors Staff method - StaffWrite Initialize each of the classes, and print out the contents of each class to show inheritance. Create a Class Diagram for your program using VS Class Diagram/Designer…arrow_forward
- What are the three responsibilities that come with working with classes that include member variables that are pointers and for which you are responsible?arrow_forwardUse abstract classes and pure virtual functions to design classes to manipulate various types ofaccounts. For simplicity, assume that the bank offers three types of accounts: savings, checking, andcertificate of deposit, as described next.Savings accounts: Suppose that the bank offers two types of savings accounts: one that has no minimumbalance and a lower interest rate and another that requires a minimum balance and has a higherinterest rate.Checking accounts: Suppose that the bank offers three types of checking accounts: one with a monthlyservice charge, limited check writing, no minimum balance, and no interest; another with no monthlyservice charge, a minimum balance requirement, unlimited check writing and lower interest; and a thirdwith no monthly service charge, a higher minimum requirement, a higher interest rate, and unlimitedcheck writing.Certificate of deposit (CD): In an account of this type, money is left for some time, and these accountsdraw higher interest rates than…arrow_forwardWhat does the ASSUME directive aim to achieve?arrow_forward
- C++ Programming: From Problem Analysis to Program...Computer ScienceISBN:9781337102087Author:D. S. MalikPublisher:Cengage Learning