代码同上一题,代码执行结果是( )。
博弈问题:确定必胜态和必败态。一个状态是必胜态当且仅当存在一个操作使其变为必败态,是必败态当且仅当所有操作都变为必胜态。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】继承|虚函数|多态
1. 考纲定位 本题考查 GESP 六级“面向对象编程”模块的核心机制。命题人专门卡住"virtual 关键字导致动态绑定”的盲区——大量考生仍用静态绑定思维,看到 Animal 就默认调用 Animal::speak()。
2. 解题思维 继承链:Dog 继承 Animal,并重写 speak()。对象实际类型是 Dog,虚函数表(vtable)指向 Dog::speak(),因此输出 Dog barks。通法:基类声明 virtual 函数,派生类覆盖实现后,无论通过哪个类指针/引用调用,最终执行派生类版本;若基类未 virtual 或派生类未重写,则按静态类型调用。
3. 陷阱拆解 A 项是误以为“基类函数不可覆盖”;C 项是忽略继承语法的合法性;D 项是过度联想内存错误。最阴险细节是 Dog 构造函数默认继承 Animal 构造函数链,不会触发任何异常或资源泄漏。若题目把 speak() 改成普通函数,答案即变 A——这就是命题人埋的“去掉 virtual 关键字”陷阱。
4. 反命题思维 命题人视角:若去掉 virtual 关键字,答案变 A;若 Dog 不重写 speak,答案仍 A。一句话提醒:遇到继承体系题,先确认虚函数表是否生效,再判断调用时对象的实际类型。