Derived Class C++

Derived Class C++

本文关键字:C++ Class Derived      更新时间:2023-10-16

我知道这可能是一个愚蠢的问题,但我什至不知道如何命名这个问题。我的母语不是英语。我从一本书中学到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)

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

零件

:Employee(name, payRate)

你提到的是用来调用构造函数的

Employee(string empName, double payRate)

在执行构造函数主体之前Employee基类

Manager(string name, double payRate, bool isSalaried)

的派生类Manager .

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

:Employee(name, payRate)

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

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

构造函数上的冒号后面是什么,称为初始化列表,在您的情况下,它只是使用合适的构造函数启动基类

即使没有构造函数,代码也可以正常工作(即您可以使用默认构造函数接受变量并实现两种方法来填充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;}
};