派生类C ++

时间:2016-07-12 11:14:19

标签: c++ inheritance

我知道这可能是一个愚蠢但我甚至不知道如何命名这个问题。我是非母语英语。我从一本书中学习C ++,并且有一个程序显示员工(基类)和Manager(派生类)的名称和工资率,并添加了bool变量salaried。这是源代码:

//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)

必须添加到代码才能正常工作吗?

6 个答案:

答案 0 :(得分:1)

它调用基类的(Employee)构造函数并将namepayRate传递给它,因为它们是Employee的成员。

答案 1 :(得分:1)

部分

:Employee(name, payRate)

你提到用于调用构造函数

Employee(string empName, double payRate)
执行构造函数体

之前的基类Employee

Manager(string name, double payRate, bool isSalaried)

派生类Manager

答案 2 :(得分:0)

:Employee(name, payRate)

是类Manager继承的基类的初始化。

答案 3 :(得分:0)

实际上没有这一行代码应该编译正常(因为你有Employee的默认构造函数),但是从Employee继承的字段将无法在emp2中正确初始化。这部分代码的作用是调用Employee的构造函数来初始化从该类继承的字段。

答案 4 :(得分:0)

在构造函数名为initialization list的冒号之后发生了什么,在您的情况下,它只是使用合适的构造函数启动基类

答案 5 :(得分:0)

即使没有构造函数,代码也可以正常工作(即,您可以使用默认构造函数接受变量并实现两种方法来填充namepay。)

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;}
};