์ค๋ฒ๋ก๋ฉ์ ๊ฐ์ ํจ์๋ผ๋ ๋งค๊ฐ๋ณ์๋ง ๋ค๋ฅด๋ฉด ์ผ๋ง๋ ์ง ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
์์ ๊ด๊ณ์ ์๋ ํด๋์ค ๊ฐ์ ๊ฐ์ ์ด๋ฆ์ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก์, ๊ธฐ๋ณธ ํด๋์ค์์ ์ ์ธ๋ ํจ์์ ๊ฐ์ ์ด๋ฆ์ ํจ์๊ฐ ํ์ ํด๋์ค์์ ์ฌ์ ์๋์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ค๋ฒ๋ผ์ด๋ ๋์๋ค๊ณ ํ๋ค.
๋์ ๋ฐ์ธ๋ฉ Dynamic binding =Late binding =Runtime binding
new
์ฐ์ฐ์๋ ๋์ ์ผ๋ก ๋ฐฐ์ด์ ํ ๋นํ ์ ์๋ค.int* gradesArray = new int[10];
int* gradesArray = new int[count1+count2];
ํธ๋ค(handle)์ ์๋ฃํ(์ฆ, base class)์ ํจ์๊ฐ ์๋
#ifndef COMMISSIONEMPLOYEE_H
#define COMMISSIONEMPLOYEE_H
#include <string>
using namespace std;
class CommissionEmployee
{
public:
CommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0);
void setFirstName(const string &);
string getFirstName() const;
void setLastName(const string &);
string getLastName() const;
void setSocialSecurityNumber(const string &);
string getSocialSecurityNumber() const;
void setGrossSales(double);
double getGrossSales() const;
void setCommissionRate(double);
double getCommissionRate() const;
double earnings() const;
void print() const;
private:
string firstName;
string lastName;
string socialSecurityNumber;
double grossSales;
double commissionRate;
};
#endif
#include "CommissionEmployee.h"
#include <iostream>
#include <string>
using namespace std;
CommissionEmployee::CommissionEmployee(const string &first, const string &last, const string &ssn, double sales, double rate)
{
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
setGrossSales(sales);
setCommissionRate(rate);
}
double CommissionEmployee::earnings() const
{
return commissionRate * grossSales;
}
double CommissionEmployee::getCommissionRate() const
{
return commissionRate;
}
string CommissionEmployee::getFirstName() const
{
return firstName;
}
double CommissionEmployee::getGrossSales() const
{
return grossSales;
}
string CommissionEmployee::getLastName() const
{
return lastName;
}
string CommissionEmployee::getSocialSecurityNumber() const
{
return socialSecurityNumber;
}
void CommissionEmployee::print() const
{
cout << "commission employee: "
<< getFirstName() << ' ' << getLastName() << endl
<< "social security number: " << getSocialSecurityNumber() << endl
<< "gross sales: " << getGrossSales() << endl
<< "commission rate: " << getCommissionRate() << endl;
}
void CommissionEmployee::setCommissionRate(double rate)
{
commissionRate = (rate > 0.0 && rate < 1.0) ? rate : 0;
}
void CommissionEmployee::setFirstName(const string &first)
{
firstName = first;
}
void CommissionEmployee::setGrossSales(double sales)
{
grossSales = sales < 0.0 ? 0 : sales;
}
void CommissionEmployee::setLastName(const string &last)
{
lastName = last;
}
void CommissionEmployee::setSocialSecurityNumber(const string &ssn)
{
socialSecurityNumber = ssn;
}
#ifndef BASEPLUSCOMMISSIONEMPLOYEE_H
#define BASEPLUSCOMMISSIONEMPLOYEE_H
#include <string>
#include "CommissionEmployee.h"
using namespace std;
class BasePlusCommissionEmployee : public CommissionEmployee
{
private:
double baseSalary;
public:
BasePlusCommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0, double = 0.0);
void setBaseSalary(double);
double getBaseSalary() const;
void print() const;
double earnings() const;
};
#endif
#include "BasePlusCommissionEmployee.h"
#include <iostream>
#include <string>
#include "CommissionEmployee.h"
using namespace std;
BasePlusCommissionEmployee::BasePlusCommissionEmployee(const string &first, const string &last, const string &ssn, double sales, double rate, double salary)
: CommissionEmployee(first, last, ssn, sales, rate)
{
setBaseSalary(salary);
}
double BasePlusCommissionEmployee::earnings() const
{
return getBaseSalary() + CommissionEmployee::earnings();
}
double BasePlusCommissionEmployee::getBaseSalary() const
{
return baseSalary;
}
void BasePlusCommissionEmployee::print() const
{
cout << "base-salaried ";
CommissionEmployee::print();
cout << "base salary: " << baseSalary << endl;
}
void BasePlusCommissionEmployee::setBaseSalary(double salary)
{
baseSalary = salary < 0.0 ? 0 : salary;
}
print() ํจ์๋ฅผ virtual๋ก ์ ์ธํ์ ๋์ ์๋ ๋์ ์ฐจ์ด์ (์์์ * ๋ถ๋ถ)์ ํ์ธํ ๊ฒ
#include "CommissionEmployee.h"
#include "BasePlusCommissionEmployee.h"
int main()
{
CommissionEmployee commissionEmployee(
"Sue", "Jones", "222-22-2222", 10000, .06);
BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = 0;
// aim derived-class pointer at base-class object
// Error: a CommissionEmployee is not a BasePlusCommissionEmployee
basePlusCommissionEmployeePtr = &commissionEmployee;
return 0;
}
virtual
ํค์๋๋ฅผ ํจ์ ์ํ ์์ ๋ถ์์ผ๋ก์จ ๊ฐ์ํจ์๋ฅผ ์ ์ธ
virtual void print()
ํน์ ๊ฐ์ฒด๊ฐ dot operator๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉค๋ฒ ํจ์๋ฅผ ํธ์ถํ๋ฉด, virtual ์ฌ๋ถ์ ๊ด๊ณ์์ด ํธ์ถ๋ ํจ์๋ (ํธ๋ค์ ์ํด) ์ปดํ์ผ ์๊ฐ์ ๊ฒฐ์ ๋๋ค.
๊ฐ์ํจ์์ ๋์ ๋ฐ์ธ๋ฉ์ ํฌ์ธํฐ ๋๋ ์ฐธ์กฐํ์ ํธ๋ค์์๋ง ์ด๋ฃจ์ด์ง๋ค.
#ifndef COMMISSION_EMPLOYEE_H
#define COMMISSION_EMPLOYEE_H
#include <string>
using namespace std;
class CommissionEmployee
{
public:
CommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0);
void setFirstName(const string &);
string getFirstName() const;
void setLastName(const string &);
string getLastName() const;
void setSocialSecurityNumber(const string &);
string getSocialSecurityNumber() const;
void setGrossSales(double);
double getGrossSales() const;
void setCommissionRate(double);
double getCommissionRate() const;
virtual double earnings() const;
virtual void print() const;
private:
// protected:
string firstName;
string lastName;
string socialSecurityNumber;
double grossSales;
double commissionRate;
};
#endif
#include <iostream>
using std::cout;
#include "CommissionEmployee.h"
CommissionEmployee::CommissionEmployee(
const string &first, const string &last, const string &ssn,
double sales, double rate)
{
firstName = first;
lastName = last;
socialSecurityNumber = ssn;
setGrossSales(sales);
setCommissionRate(rate);
}
void CommissionEmployee::setFirstName(const string &first)
{
firstName = first;
}
string CommissionEmployee::getFirstName() const
{
return firstName;
}
void CommissionEmployee::setLastName(const string &last)
{
lastName = last;
}
string CommissionEmployee::getLastName() const
{
return lastName;
}
void CommissionEmployee::setSocialSecurityNumber(const string &ssn)
{
socialSecurityNumber = ssn;
}
string CommissionEmployee::getSocialSecurityNumber() const
{
return socialSecurityNumber;
}
void CommissionEmployee::setGrossSales(double sales)
{
grossSales = (sales < 0.0) ? 0.0 : sales;
}
double CommissionEmployee::getGrossSales() const
{
return grossSales;
}
void CommissionEmployee::setCommissionRate(double rate)
{
commissionRate = (rate > 0.0 && rate < 1.0) ? rate : 0.0;
}
double CommissionEmployee::getCommissionRate() const
{
return commissionRate;
}
double CommissionEmployee::earnings() const
{
return commissionRate * grossSales;
}
void CommissionEmployee::print() const
{
cout << "commission employee: " << firstName << ' ' << lastName
<< "\nsocial security number: " << socialSecurityNumber
<< "\ngross sales: " << grossSales
<< "\ncommission rate: " << commissionRate;
}
#ifndef BASE_PLUS_COMMISSION_EMPLOYEE_H
#define BASE_PLUS_COMMISSION_EMPLOYEE_H
#include <string>
#include "CommissionEmployee.h"
using namespace std;
class BasePlusCommissionEmployee : public CommissionEmployee
{
public:
BasePlusCommissionEmployee(const string &, const string &, const string &,
double = 0.0, double = 0.0, double = 0.0);
void setBaseSalary(double);
double getBaseSalary() const;
virtual double earnings() const;
virtual void print() const;
private:
double baseSalary;
};
#endif
#include <iostream>
using std::cout;
#include "BasePlusCommissionEmployee.h"
BasePlusCommissionEmployee::BasePlusCommissionEmployee(
const string &first, const string &last, const string &ssn,
double sales, double rate, double salary)
: CommissionEmployee(first, last, ssn, sales, rate)
{
setBaseSalary(salary);
}
void BasePlusCommissionEmployee::setBaseSalary(double salary)
{
baseSalary = (salary < 0.0) ? 0.0 : salary;
}
double BasePlusCommissionEmployee::getBaseSalary() const
{
return baseSalary;
}
double BasePlusCommissionEmployee::earnings() const
{
// double tempCommissionRate = getCommissionRate();
// double tempGrossSales = getGrossSales();
// return baseSalary + (tempCommissionRate * tempGrossSales);
return baseSalary + (getCommissionRate() * getGrossSales());
}
void BasePlusCommissionEmployee::print() const
{
cout << "base-salaried commission emplyee: " << getFirstName() << ' '
<< getLastName() << "\nsocial security number: " << getSocialSecurityNumber()
<< "\ngross sales: " << getGrossSales()
<< "\ncommission rate: " << getCommissionRate()
<< "\nbase salary: " << baseSalary;
}
#include <iostream>
#include <iomanip>
#include "BasePlusCommissionEmployee.h"
#include "CommissionEmployee.h"
using namespace std;
int main()
{
CommissionEmployee commissionEmployee(
"Sue", "Jones", "222-22-2222", 10000, 0.6);
CommissionEmployee *commissionEmployeePtr = 0;
BasePlusCommissionEmployee basePlusCommissionEmployee(
"Bob", "Lewis", "333-33-3333", 5000, 0.04, 300);
BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = 0;
cout << fixed << setprecision(2);
cout << "Invoking print function on base-class and derived-class "
<< "\nobjects with static binding\n\n";
commissionEmployee.print();
cout << "\n\n";
basePlusCommissionEmployee.print();
cout << "\n\n\nInvoking print function on base-class and "
<< "derived-class \nobjects with dynamic binding:";
commissionEmployeePtr = &commissionEmployee;
cout << "\n\nCalling virtual function print with base-class pointer"
<< "\n to base-class object invokes base-class "
<< "print function:\n\n";
commissionEmployeePtr->print();
basePlusCommissionEmployeePtr = &basePlusCommissionEmployee;
cout << "\n\nCalling virtual function print with derived-class "
<< "pointer\nto derived-class object invokes derived-class "
<< "print function:\n\n";
basePlusCommissionEmployeePtr->print();
commissionEmployeePtr = &basePlusCommissionEmployee;
cout << "\n\nCalling virtual function print with base-class pointer "
<< "\nto derived-class object invokes derived-class "
<< "print function:\n\n";
commissionEmployeePtr->print();
cout << endl;
return 0;
}
Virtual void draw() const =0;