在面向对象编程中,下列关于虚函数的描述中,错误的是( )。
C++类:构造函数(对象创建时调用)、析构函数(对象销毁时调用)、虚函数(实现多态)。构造函数不能为虚。
构造函数不能是虚函数(虚表在构造函数完成后才建立)。析构函数可以且通常应该为虚函数(防止内存泄漏)。
【考点】虚函数与运行时多态|构造函数特性|基类析构函数
🎯 考纲定位:本题出自 GESP 六级 C++ 面向对象编程模块,精准卡住"虚函数有例外"这一高频失分点。绝大多数考生能记住"虚函数支持多态",却误以为构造函数也适用,命题人专门用这个绝对化表述(C 选项)筛掉死记硬背者。
🧠 解题思维:先抓定义——虚函数通过动态绑定实现运行时多态,故 A 正确。基类指针调用虚函数时,编译器不决定版本,而是根据对象实际类型(B 正确)。构造函数在对象构造期间执行,此时对象类型尚未确定,无法进行动态绑定,因此不能声明为虚函数(C 错误)。基类析构函数声明为虚函数可确保派生类对象被正确销毁,避免资源泄漏(D 正确)。
🪤 陷阱拆解:A 项是虚函数的核心用途,无争议。B 项"基类指针调用虚函数"是动态绑定的典型场景,命题人用"决定调用版本"这一模糊表述迷惑考生,实则指向正确。D 项是 C++ 最佳实践,命题人将其作为干扰项,但考生若理解构造函数和析构函数的生命周期差异,就不会误选。C 项的陷阱在于"构造函数可以声明为虚函数以支持多态"这一绝对化表述,它利用了考生对"多态"概念的过度泛化,以为所有函数都能支持多态。
🔄 反命题思维:若把 C 选项改为"析构函数可以声明为虚函数以支持多态",答案仍为 C,因为析构函数确实可虚化;若把题干改为"关于多态的下列说法正确的是",则 A、B、D 皆正确。刷到此类题,先问自己"命题人想考我什么"——是考虚函数的定义,还是考构造/析构的特殊性?