下面关于 C++ 类构造和析构函数的说法,错误的是( )。
C++类:构造函数(对象创建时调用)、析构函数(对象销毁时调用)、虚函数(实现多态)。构造函数不能为虚。
构造函数不能是虚函数(虚表在构造函数完成后才建立)。析构函数可以且通常应该为虚函数(防止内存泄漏)。
【考点】虚函数机制|对象多态|访问控制
1. 考纲定位 本题考查 GESP 六至七级 C++ 面向对象模块中「构造/析构函数」与「访问控制」的语义辨析。命题人专卡「虚函数」与「必须」的绝对化表述,这是绝大多数考生混淆「基类多态保护」与「全量强制规则」的高发区。
2. 解题思维 看到「析构函数必须声明为虚函数」要立即警觉——虚析构是基类多态的必要保护,但「必须」二字把适用范围无限扩大。核心推理链:只有当基类指针 Delete 派生对象时,才要求虚析构,否则基类析构就能正常工作;构造函数本质是初始化而非函数调用,C++ 标准直接禁止声明 virtual。
3. 陷阱拆解 逐项拆解:A 项构造函数确实无法声明虚函数(C++ 标准禁止);C、D 项默认构造与析构均可声明 private,这是封装工厂类的常用手段;只有 B 项「必须」是命题人埋下的绝对化陷阱——非基类或非多态场景下析构函数完全可以是普通函数,强行加 virtual 反而可能引发二义性。
4. 反命题思维 若命题人把「必须」改为「基类析构函数应当声明为虚函数」,答案就会变成 C;若把「virtual」改成「override」,则考察点会转向虚继承与多态实现细节。刷到此类题先问自己:「这个条件在什么场景下成立?」