Sei sulla pagina 1di 30

Polymorphism Case Study

http://ecomputernotes.com

Polymorphism Case Study


A Simple Payroll Application

http://ecomputernotes.com

Problem Statement
Develop a simple payroll application. There are three kinds of employees in the system: salaried employee, hourly employee, and commissioned employee. The system takes as input an array containing employee objects, calculates salary polymorphically, and generates report.

http://ecomputernotes.com

OO Model
Employee name taxRate getName calcSalary String pStr String operator = operator <<

SalariedEmp salary calcSalary

HourlyEmp hours hourlyRate calcSalary

CommEmp sales commRate calcSalary

Class Employee
class Employee { private: String name; double taxRate; public: Employee( String&, double ); String getName(); virtual double calcSalary() = 0; }
http://ecomputernotes.com

Class Employee
Employee::Employee( String& n, double tr ): name(n){ taxRate = tr; } String Employee::getName() { return name; }
http://ecomputernotes.com

Class SalariedEmp
class SalariedEmp : public Employee { private: double salary; public: SalariedEmp(String&,double,double); virtual double calcSalary(); }
http://ecomputernotes.com

Class SalariedEmp
SalariedEmp::SalariedEmp(String& n, double tr, double sal) : Employee( n, tr ) { salary = sal; } double SalariedEmp::calcSalary() { double tax = salary * taxRate; return salary tax; }
http://ecomputernotes.com

Class HourlyEmp
class HourlyEmp : public Employee { private: int hours; double hourlyRate; public: HourlyEmp(string&,double,int,double); virtual double calcSalary(); }
http://ecomputernotes.com

Class HourlyEmp
HourlyEmp ::HourlyEmp( String& n, double tr, int h, double hr ) : Employee( n, tr ) { hours = h; hourlyRate = hr; }

http://ecomputernotes.com

Class HourlyEmp
double HourlyEmp::calcSalary() { double grossPay, tax; grossPay = hours * hourlyRate; tax = grossPay * taxRate; return grossPay tax; }
http://ecomputernotes.com

Class CommEmp
class CommEmp : public Employee { private: double sales; double commRate; public: CommEmp( String&, double, double, double ); virtual double calcSalary(); }
http://ecomputernotes.com

Class CommEmp
CommEmp::CommEmp( String& n, double tr, double s, double cr ) : Employee( n, tr ) { sales = s; commRate = cr; }

http://ecomputernotes.com

Class CommEmp
double CommEmp::calcSalary() { double grossPay = sales * commRate; double tax = grossPay * taxRate; return grossPay tax; }
http://ecomputernotes.com

A Sample Payroll
int main() { Employee* emp[10]; emp[0] = new SalariedEmp( Aamir, 0.05, 15000 ); emp[1] = new HourlyEmp( Faakhir, 0.06, 160, 50 ); emp[2] = new CommEmp( Fuaad, 0.04, 150000, 10 ); generatePayroll( emp, 10 ); return 0; } http://ecomputernotes.com

A Sample Payroll
void generatePayroll(Employee* emp[], int size) { cout << Name\tNet Salary\n\n; for (int i = 0; i < size; i++) { cout << emp[i]->getName() << \t << emp[i]->calcSalary() << \n; } }
http://ecomputernotes.com

Sample Output
Name Aamir Fakhir Fuaad Net Salary 14250 7520 14400

http://ecomputernotes.com

Never Treat Arrays Polymorphically

http://ecomputernotes.com

Shape Hierarchy Revisited


Shape draw calcArea

Line draw calcArea

Circle draw calcArea

Triangle draw calcArea

Shape Hierarchy
class Shape { public: Shape(); virtual void draw(){ cout << Shape\n; } virtual int calcArea() { return 0; } };

Shape Hierarchy
class Line : public Shape { public: Line(Point p1, Point p2); void draw(){ cout << Line\n; } }

drawShapes()
void drawShapes( Shape _shape[], int size ) { for (int i = 0; i < size; i++) { _shape[i].draw(); } }

Polymorphism & Arrays


int main() { Shape _shape[ 10 ]; _shape[ 0 ] = Shape(); _shape[ 1 ] = Shape(); drawShapes( _shape, 10 ); return 0; }

Sample Output
Shape Shape Shape

Polymorphism & Arrays


int main() { Point p1(10, 10), p2(20, 20), Line _line[ 10 ]; _line[ 0 ] = Line( p1, p2 ); _line[ 1 ] = Line( p3, p4 ); drawShapes( _line, 10 ); return 0; }

Sample Output
Shape // Run-time error

Because
0000 0010 0020 0030 0000 0015 0030

Shape Array

0045

Line Array
_shape[ i ].draw(); *(_shape + (i * sizeof(Shape))).draw();

Original drawShapes()
void drawShapes(Shape* _shape[], int size) { for (int i = 0; i < size; i++) { _shape[i]->draw(); } }

Sample Output
Line Line Line

Because
_line1 0000 0004 0008 0012 Shape* _shape[] _line2 _line3

_shape[i]->draw(); (_shape + (i * sizeof(Shape*)))->draw();

Potrebbero piacerti anche