跳转至

练习:使用 override 覆盖虚函数


任务描述

设计 EmployeeManager,使用 override 覆盖工资计算函数。

相关知识

override 让编译器检查派生类函数是否真正覆盖基类虚函数,可避免参数或 const 不一致造成的隐藏。

覆盖的条件

派生类函数要覆盖基类虚函数,函数名、参数列表、const 属性等必须匹配。本题中两个函数均为 salary() const;漏写 const 会使其成为不同函数。

经由基类引用调用

const Employee& employee = manager; 不会复制 Manager 对象。调用 employee.salary() 时应分派至 Manager::salary()

编程要求

  1. Employee::salary() const 返回基础工资,声明为虚函数。
  2. Manager::salary() const override 在基础工资上增加津贴。
  3. 通过 const Employee& 调用并断言经理工资为 12000
  4. baseallowance 应为非负整数;本题不要求处理非法输入。
  5. 不得在 test 中直接调用 manager.salary() 代替基类引用调用。

待完成代码

#include <cassert>
#include <iostream>
#include <sstream>

// TODO:定义 Employee 和 Manager
void test() {
    Manager manager(10000, 2000);
    const Employee& employee = manager;
    assert(employee.salary() == 12000);

    std::ostringstream output;
    std::streambuf* oldBuffer = std::cout.rdbuf(output.rdbuf());
    std::cout << "经理工资:" << employee.salary() << '\n';
    std::cout.rdbuf(oldBuffer);
    assert(output.str() == "经理工资:12000\n");
}

int main() {
    test();
    std::cout << "本关测试通过" << std::endl;
    return 0;
}

测试说明

测试经由 const Employee& 而非 Manager 对象调用,预期输出为 经理工资:12000


开始你的任务吧,祝你成功!