下列代码执行后的输出结果是( )。
class Animal {
public:
virtual void speak() {
cout << "Animal ";
}
virtual ~Animal() = default;
};
class Cat : public Animal {
public:
void speak() override {
cout << "Cat ";
}
};
int main() {
Animal *p = new Cat();
p->speak();
delete p;
return 0;
}看到虚函数调用先确认动态绑定机制,看到delete先确认析构顺序。核心是理解虚析构函数对对象销毁的影响。
选项A忽略动态绑定,误判为静态调用;选项C混淆析构函数输出行为;选项D误以为缺少虚析构函数会编译失败。
本题考查GESP六级《高级编程》模块中虚函数与多态、析构函数两个核心考点。命题人专门设置这道题,就是要卡住那些"知道虚函数但不懂虚析构"的考生——六级考生普遍能写出虚函数重写,但约60%的人不知道虚析构函数对delete操作的影响。
调用p->speak()时,由于speak是虚函数,执行动态绑定,实际调用Cat::speak(),输出"Cat "。
执行delete p时,因为Animal的析构函数声明为virtual,会按派生类→基类顺序调用:
Cat的析构函数(未定义,使用默认析构函数,无输出)Animal的析构函数(定义为= default,无输出)因此最终输出只有"Cat"。