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

C++继承类Papersworker调用GetSalary方法cout无法输出薪资求助

问题原因及修复方案

直接导致无输出的原因

程序运行后会先执行std::cin >> sr;等待控制台输入数值,此时程序处于阻塞状态,没有后续输出属于正常情况,输入合法数字后按下回车,即可看到对应的薪资计算结果。
如果输入后依然没有输出,可在最后一行cout后添加<< std::endl;或者<< std::flush;强制刷新输出缓冲区即可。

代码核心逻辑问题

1. 派生类重复定义同名成员导致成员隐藏

你在基类Employee中已经定义了FirstName、LastName、Patronymic、Salary四个成员,又在派生类Papersworker中重复定义了完全同名的私有成员,会导致两个问题:

  • 基类构造函数只会初始化继承自基类的四个成员,派生类自有成员始终处于未初始化的无效状态
  • ChangeNameSalary、PrintPapersworker方法操作的是派生类自有成员,和基类成员完全无关,数据出现割裂
    按照作业要求四个成员必须设为私有的规则,正确写法为:
  • 把基类的四个成员改为private修饰
  • 基类提供公有的get/set成员函数,供派生类和外部访问对应成员
  • 删掉派生类中重复定义的四个同名成员

2. 其他可优化点

  • 基类operator==的参数改为const Employee& other传引用,避免不必要的对象拷贝
  • 不会修改类成员的函数都加上const修饰,符合const正确性要求
  • 字符串类型的入参改为const std::string&,减少字符串拷贝开销
  • Coefficient系数表属于所有Papersworker实例共享的固定配置,可以改为static const修饰,避免每个实例都单独存储一份

修正后核心代码示例

基类修改

class Employee
{
private:
    // 按照作业要求设为私有
    std::string FirstName;
    std::string LastName;
    std::string Patronymic;
    double Salary;
public:
    Employee() {};
    explicit Employee(std::string firstName, std::string lastName,
        std::string patronymic, double salary)
        : FirstName(std::move(firstName)), LastName(std::move(lastName)),
        Patronymic(std::move(patronymic)), Salary(salary) {}
    // 提供读写接口
    std::string getFirstName() const { return FirstName; }
    std::string getLastName() const { return LastName; }
    std::string getPatronymic() const { return Patronymic; }
    double getSalary() const { return Salary; }
    void setFirstName(std::string val) { FirstName = std::move(val); }
    void setLastName(std::string val) { LastName = std::move(val); }
    void setPatronymic(std::string val) { Patronymic = std::move(val); }
    void setSalary(double val) { Salary = val; }
    bool operator==(const Employee& other) const
    {
        return this->FirstName == other.FirstName && 
            this->LastName == other.LastName && 
            this->Patronymic == other.Patronymic;
    }
};

派生类修改

class Papersworker : public Employee
{
public:
    Papersworker() {};
    using Employee::Employee;
    const std::string Job = "Papersworker";
    // 系数表设为静态全局共享
    inline static const std::map<std::string, double> Coefficient = 
    {
        {"Director", 4.2},
        {"Papersworker", 1.2},
        {"Guardian", 1.5},
        {"Programmer", 2.5}
    };
    void ChangeCoefficient(const std::string& Job, double NewCoefficient)
    {
        // 如需修改系数,需去掉Coefficient的const修饰
        // Coefficient[Job] = NewCoefficient;
    }
    void ChangeNameSalary(const std::string& FirstName, const std::string& LastName, const std::string& Patronymic, double Salary)
    {
        setFirstName(FirstName);
        setLastName(LastName);
        setPatronymic(Patronymic);
        setSalary(Salary);
    }
    void PrintPapersworker() const
    {
        std::cout << "First name\t" << "Lastname\t" << "Patronymic\t" << "Salary\n" 
        << getFirstName() << "\t\t" << getLastName() << "\t" << getPatronymic() << "\t" << getSalary() << "\n" << std::flush;
        for (const auto& i : Coefficient)
        {
            std::cout << i.first << " = " << i.second << ";\t" << std::flush;
        }
        std::cout << "\n------------------------------------------------------------\n" << std::flush;
    }
    double GetSalary(double baseSalary, const std::string& Job) const
    {
        return baseSalary * Coefficient.at(Job); // 用at避免不存在的键自动插入
    }
};

main函数修改

int main()
{
   Papersworker pwr;
   double sr = 0.0;
   std::cout << "\nEnter director's salary\t" << std::flush; 
   std::cin >> sr;
   // 加endl强制刷新缓冲区
   std::cout << "\nSalary\t" << pwr.GetSalary(sr, "Director") << std::endl;
   return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:54:02