int main() { CommissionEmployee commissionEmployee( "Sue", "Jones", "222-22-2222", 10000, .06 ); BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = nullptr; // aim derived-class pointer at base-class object // Error: a CommissionEmployee is not a BasePlusCommissionEmployee basePlusCommissionEmployeePtr = &commissionEmployee; } // end main
int main(int argc, const char* argv[]) { // set floating-point output formatting std::cout << std::fixed << std::setprecision(2); // create derived-class objects SalariedEmployee salariedEmployee("John", "Smi.hpp", "111-11-1111", 800); CommissionEmployee commissionEmployee("Sue", "Jones", "333-33-3333", 10000, .06); BasePlusCommissionEmployee basePlusCommissionEmployee( "Bob", "Lewis", "444-44-4444", 5000, .04, 300); std::cout << "Employees processed individually using static binding:\n\n"; // output each Employee's information and earnings using static binding salariedEmployee.print(); std::cout << "\nearned $" << salariedEmployee.earnings() << "\n\n"; commissionEmployee.print(); std::cout << "\nearned $" << commissionEmployee.earnings() << "\n\n"; basePlusCommissionEmployee.print(); std::cout << "\n\nearned $" << basePlusCommissionEmployee.earnings() << "\n\n"; // create vector of three base-class pointers std::vector<Employee*> employees(3); // initialise vector with Employees employees[0] = &salariedEmployee; employees[1] = &commissionEmployee; employees[2] = &basePlusCommissionEmployee; std::cout << "Employees processed polymorphically via dynamic binding:\n\n"; // call virtualViaPointer to print each Employee's information // and earnings using dynamic binding std::cout << "Virtual function call made off base-class pointers:\n\n"; for (size_t i = 0; i < employees.size(); ++i) { virtualViaPointer(employees[i]); } // call virtualViaReference to print each Employee's information // and earnings using dynamic binding std::cout << "Virtual function calls made off base-class references:\n\n"; for (size_t i = 0; i < employees.size(); ++i) { virtualViaReference(*employees[i]); // not dereferencing } return 0; }
int main(int argc, const char *argv[]) { // create base-class object CommissionEmployee commissionEmployee("Sue", "Jones", "222-22-2222", 10000, .06); // create base-class pointer CommissionEmployee *commissionEmployeePtr = 0; // create derived-class object BasePlusCommissionEmployee basePlusCommissionEmployee( "Bob", "Lewis", "333-33-3333", 5000, .04, 300); // create dervied-class pointer BasePlusCommissionEmployee *basePlusCommissionEmployeePtr = 0; // set floating-point output formatting std::cout << std::fixed << std::setprecision(2); // output objects using static binding std::cout << "Invoking print function on base-class and derived-class " << "\nobject with static binding\n\n"; commissionEmployee.print(); // static binding std::cout << "\n\n"; basePlusCommissionEmployee.print(); // static binding // output objects with dynamic binding std::cout << "\n\n\nInvoking print function on base-class and " << "derived-class \nobjects with dynamic binding"; // aim base-class pointer at base-class object and print commissionEmployeePtr = &commissionEmployee; std::cout << "\n\nCalling virtual function print with derived-class " << "pointer\nto derived-class object invokes derived-class " << "print function:\n\n"; basePlusCommissionEmployeePtr->print(); // aim base-class pointer at derived-class object and print commissionEmployeePtr = &basePlusCommissionEmployee; std::cout << "\n\nCalling virtual function print with base-class pointer" << "\nto derived-class object invokes derived-class " << "print function:\n\n"; // polymorphism; invokes BasePlusCommissionEmployee's print; // base-class pointer to derived-class object commissionEmployeePtr->print(); std::cout << std::endl; return 0; }