面试题答案
一键面试- 能否调用:
- 在C++中,抽象类的构造函数不能调用纯虚函数。
- 原因(从编译器原理角度):
- 纯虚函数是没有具体实现的函数,在编译器生成代码时,它只是一个占位符,没有可执行的代码体。当构造函数调用纯虚函数时,编译器无法为其生成正确的调用代码,因为找不到对应的函数实现。
- 原因(从运行时机制角度):
- 在对象构造过程中,虚函数表(vtable)还没有完全初始化。对于抽象类,其纯虚函数在虚函数表中的条目指向的是未定义的行为。当构造函数调用纯虚函数时,运行时通过虚函数表调用该函数,由于虚函数表此时状态可能未完全正确建立且纯虚函数无实际实现,会导致未定义行为。
- 调用后果:
- 编译错误:在一些严格的编译器环境下,编译器会检测到这种非法调用并报错,阻止程序编译通过。
- 未定义行为:如果编译器没有足够严格的检测,在运行时,调用纯虚函数会导致未定义行为,可能出现程序崩溃、内存访问错误、数据损坏等各种不可预测的结果。