2016-07-12 4 views
0

Я знаю, что это может быть глупо, но я даже не знаю, как назвать этот вопрос. Я не родной английский. Я изучаю C++ из книги, и есть программа, которая показывает имя и уровень оплаты труда сотрудника (базовый класс) и Manager (производный класс) с добавленной переменной boolsalaried. Вот исходный код:Производный класс C++

//base class 
class Employee { 
private: 
    string name; 
    double pay; 
public: 
    Employee() { 
     name = ""; 
     pay = 0; 
    } 

    Employee(string empName, double payRate) { 
     name = empName; 
     pay = payRate; 
    } 

    string getName() const { 
     return name; 
    } 

    void setName(string empName) { 
     name = empName; 
    } 

    double getPay() const { 
     return pay; 
    } 

    void setPay(double payRate) { 
     pay = payRate; 
    } 

    string toString() { 
     stringstream stm; 
     stm << name << ": " << pay; 
     return stm.str(); 

    } 
}; 

//derived class 
class Manager : public Employee { 
private: 
    bool salaried; 
public: 
    Manager(string name, double payRate, bool isSalaried) 
     :Employee(name, payRate) 
    { 
     salaried = isSalaried; 
    } 
    bool getSalaried() { 
     return salaried; 
    } 
}; 

int main() 
{ 
    Employee emp1("Mary Smith", 15.00); 
    cout << "Employee name: " << emp1.getName() << endl; 
    cout << "Employee pay rate: " << emp1.getPay() << endl; 
    Manager emp2("Bob Brown", 1500, true); 
    cout << "Employee name: " << emp2.getName() << endl; 
    cout << "Employee pay rate: " << emp2.getPay() << endl; 
    cout << "Is Salaried: " << emp2.getSalaried() << endl; 
    return 0; 
} 

Может кто-нибудь объяснить мне, почему эта часть

:Employee(name, payRate) 

должен быть добавлен в код, чтобы работать должным образом?

+0

Это просто вызывает 'конструктор Employee' в – DimChtz

+0

Это способ вызова параметризованного конструктора Работника. По умолчанию используется конструктор по умолчанию базового класса, но нужно вызвать параметризованный конструктор explicitliy. – user1336087

ответ

1

Часть

:Employee(name, payRate) 

вы упоминаете используются для вызова Конструктора

Employee(string empName, double payRate) 

базового класса Employee перед выполнением тела конструктора

Manager(string name, double payRate, bool isSalaried) 

из производных класс Manager.

+0

«Codor» hahaha: D –

+0

@LightnessRacesinOrbit Сочетание имени пользователя и профиля сделало мне несколько шагов, чтобы наверстать упущенное! – Codor

+1

Где есть Уиллис, есть способ. –

1

Он называет конструктор базового класса (Employee) и передает name и payRate, потому что они являются членами Employee.

0
:Employee(name, payRate) 

является инициализация базового класса этому классу Manager наследует.

0

На самом деле без этой строки кода должен компилироваться (потому что у вас есть конструктор по умолчанию для Employee), но поля, унаследованные от Employee не будут должным образом инициализированы в emp2. Эта часть кода состоит в вызове конструктора Employee для инициализации полей, унаследованных от этого класса.

0

Что придет после двоеточия на конструктор под названием initialization list и в вашем случае это просто инициировать базовый класс с соответствующим конструктором

0

код может работать должным образом, даже без конструктора (ie.you можно использовать конструктор по умолчанию принимать переменные и реализовать два метода для заполнения name и pay.)

class Employee { 
private: 
    string name; 
    string temp_name; 
    double temp_pay; 
    double pay; 
public: 
    Employee() { 
     name = temp_name; 
     pay = temp_pay; 
    } 

    void getTempname(string tem){temp_name = tem;} 
    void getTemppay(double py){ temp_pay = pay;} 
};