динамический полиморфизм не реализован должным образом в C ++ - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать иерархию системы начисления заработной платы, и мой базовый класс всего является абстрактным классом, а все остальные унаследованные классы являются конкретными классами (классами, которые могут быть созданы). У меня есть чистая виртуальная функция earning () вмой базовый класс абстрактный сотрудник базового класса .. в производных классах предусмотрена надлежащая функциональность заработка в зависимости от типа сотрудника, чей заработок рассчитывается. У меня также есть виртуальная функция в абстрактном базовом классе, которая отображает информацию, которая переопределяется во всех производных классах. Иерархия классов выглядит следующим образом:

  1. сотрудник класса;
  2. класс комиссионныхEmployee: государственный служащий;
  3. класс salariedEmployee: государственный служащий;
  4. класс basePlusCommissionEmployee: государственный служащий

Переопределенная чистая виртуальная функция сотрудника комиссионных суммирует валовые продажи работника за неделю с ставкой комиссионного вознаграждения и должна возвращать двойную сумму.

наемного работникапереопределенная функция заработка возвращает только заработную плату, заработанную сотрудником, поскольку его / ее заработная плата является единственным заработком.

basePlusCommissionEmployee означает, что сотрудник, для которого обе функции добавляются в его / ее функцию заработка, то естьзарплата этого сотрудника и комиссия, которую сотрудник будет получать от продаж, которые он / она совершает ... проблема, с которой я сталкиваюсь, заключается в том, что когда я использую указатель базового класса, чтобы указать на объект производного класса ... динамический полиморфизм действительно реализуетсяно на дисплееФункция ormation, которая переопределена в каждом классе, я не получаю полную информацию .. она не отображает ни имя сотрудника, ни его / ее заработок. enter image description here я также опубликовал изображение, которое показывает выходные данные переопределенной функции displayInformation класса наемного работника ... кроме имени и номера социального страхования, единственный дополнительный входной класс наемного работника, который запрашивает, - это зарплатаэтого сотрудника ..

#include <iostream>
#include <cstdlib>
using namespace std;
class employee
{
private:
    string name;
    string socialSecurityNumber;
public:
    void setName(string);
    string getName();
    void setSSN(string);
    string getSSN();
    virtual double earnings() = 0;
    virtual void displayInformation();
};
void employee::setName(string argName)
{
    name = argName;
}
string employee::getName()
{
    return name;
}
void employee::setSSN(string argSSN)
{
    socialSecurityNumber = argSSN;
}
string employee::getSSN()
{
    return socialSecurityNumber;
}
void employee::displayInformation()
{
    cout <<"name: " <<getName()
    <<"Social security number: " <<getSSN();
}

class salariedEmployee : public employee
{
private:
    double salary;
public:
    void setSalary(double);
    double getSalary();
    virtual double earnings();
    virtual void displayInformation();
};
void salariedEmployee::setSalary(double argSalary)
{
    salary = argSalary;
}
double salariedEmployee::getSalary()
{
    return salary;
}
double salariedEmployee::earnings()
{
    //we will only return salary because that is the only earning of a salaried employee
    return salary;
}
void salariedEmployee::displayInformation()
{
    employee::displayInformation();
    cout <<"weekly salary: " <<getSalary();
}

class commissionEmployee : public employee
{
private:
    double commissionRate;
    double grossSales;
public:
    void setCommission(double);
    double getCommission();
    void setGrossSales(double);
    double getGrossSales();
    virtual double earnings();
    virtual void displayInformation();
};
void commissionEmployee::setCommission(double argCommission)
{
    commissionRate = argCommission;
}
double commissionEmployee::getCommission()
{
    return commissionRate;
}
void commissionEmployee::setGrossSales(double argSales)
{
    grossSales = argSales;
}
double commissionEmployee::getGrossSales()
{
    return grossSales;
}
double commissionEmployee::earnings()
{
    return (commissionRate * grossSales);
}
void commissionEmployee::displayInformation()
{
    employee::displayInformation();
    cout <<"\ncommission rate: " << getCommission()
    <<"\nweekly sales: " <<getGrossSales();
}

class basePlusCommissionEmployee : public commissionEmployee
{
private:
    double salary;
public:

    void setSalary(double);
    double getSalary();
    virtual double earnings();
    virtual void displayInformation();
};
void basePlusCommissionEmployee::setSalary(double argSalary)  
{
    salary = argSalary;
}
double basePlusCommissionEmployee::getSalary()
{
   return salary;
}
double basePlusCommissionEmployee::earnings()
{
    return (getSalary() + commissionEmployee::earnings());
}
void basePlusCommissionEmployee::displayInformation()
{
    employee::displayInformation();
    commissionEmployee::displayInformation();
    cout <<"salay: " <<salary;
    cout <<endl; 
}

int main()   
{
    int choice;
    double salary;
    string name, SSN;
    cout <<"choose\n1)salaried employee\n2)commission employee\n3)base plus salaried 
    employee\nenter: ";
    cin >> choice;
    cout <<"enter name: ";
    cin >> name;
    cout <<"enter SSN: ";
    cin >>SSN;
    if(choice == 1)
    {
        employee *pointerObj = new salariedEmployee;
        salariedEmployee obj;
        obj.setName(name);
        obj.setSSN(SSN);
        cout <<"enter weekly salary: ";
        cin >> salary;
        obj.setSalary(salary);
        system("cls");
        cout <<"total earning of this employee: " <<pointerObj->earnings();
        cout <<endl;
        pointerObj->displayInformation();
    }
}

1 Ответ

1 голос
/ 05 ноября 2019

У вас есть два разных объекта ...

Сначала у вас есть объект, на который указывает pointerObj, и единственное, что вы делаете с этим объектом, - это вызываете его displayInformation функцию.

Тогда у вас есть объект obj, в котором вы устанавливаете все значения.

Если вы хотите напечатать все данные, которые вы установили для obj, вам нужно вызвать displayInformationвместо obj:

obj.displayInformation();

В противном случае вы должны установить всю информацию об объекте, указанном как pointerObj, и вообще не иметь переменной obj.

Или возможное третье решение:

employee *pointerObj = &obj;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...