练习:使用 override 覆盖虚函数¶
任务描述¶
设计 Employee 与 Manager,使用 override 覆盖工资计算函数。
相关知识¶
override 让编译器检查派生类函数是否真正覆盖基类虚函数,可避免参数或 const 不一致造成的隐藏。
覆盖的条件¶
派生类函数要覆盖基类虚函数,函数名、参数列表、const 属性等必须匹配。本题中两个函数均为 salary() const;漏写 const 会使其成为不同函数。
经由基类引用调用¶
const Employee& employee = manager; 不会复制 Manager 对象。调用 employee.salary() 时应分派至 Manager::salary()。
编程要求¶
Employee::salary() const返回基础工资,声明为虚函数。Manager::salary() const override在基础工资上增加津贴。- 通过
const Employee&调用并断言经理工资为12000。 base和allowance应为非负整数;本题不要求处理非法输入。- 不得在
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。
开始你的任务吧,祝你成功!