You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dev C++编译C++工资单程序报taxRate私有及HourlyEmp构造函数匹配错误求助

问题分析与修复方案

报错1:[Error] 'double Employee::taxRate' is private

原因

taxRate是Employee基类的private私有成员,类外包括派生类都没有直接访问权限,你在三个派生类SalariedEmp/HourlyEmp/CommEmp的calcSalary方法中直接调用该私有成员,触发了权限校验报错。

解决方案(二选一即可)

  • 方案1(更符合封装规范):在Employee基类的public区域新增税率获取方法,派生类调用该方法取值:
// 在Employee类的public块添加
double getTaxRate() const {
    return taxRate;
}
// 之后所有派生类calcSalary里的taxRate替换为getTaxRate()即可
  • 方案2:把Employee类中taxRate的访问权限从private改为protected,protected成员允许派生类直接访问:
class Employee {
private:
    string name;
protected: // 移到protected块
    double taxRate;
// 其余代码不变
};

报错2:[Error] no matching function for call to 'HourlyEmp::HourlyEmp(const char [8], double, int, int)'

原因

你所有子类和基类的构造函数第一个参数都是string&非const左值引用,而你实例化时传入的是字符串字面量(如"Faakhir"),它转换出的std::string是临时对象,C++不允许临时对象绑定到非const左值引用,因此找不到匹配的构造函数。

解决方案

把所有构造函数的第一个参数类型改为const string&,const左值引用支持绑定临时对象:

// 举例修改构造函数声明,其余子类构造函数、构造函数实现的参数都同步修改即可
Employee(const string&, double);
SalariedEmp(const string&,double,double);
HourlyEmp(const string&,double,int,double);
CommEmp(const string&, double, double, double);

其他隐藏问题修复

  1. generatePayroll函数在main函数调用前没有声明,需要在main之前加函数前置声明:
void generatePayroll(Employee* emp[], int size);
  1. emp数组共10个元素,你只初始化了前3个,剩下7个是空指针,遍历会触发崩溃,可以把遍历逻辑改为只处理非空指针,或者缩小数组长度为3。

内容的提问来源于stack exchange,提问作者azhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 16:45:05