MST

星途 面试题库

面试题:C++抽象类构造函数与纯虚函数的关系及影响

在C++中,抽象类有纯虚函数且可能有构造函数。探讨抽象类构造函数能否调用纯虚函数,如果不能,原因是什么?如果调用了会产生什么后果?请从编译器原理和运行时机制的角度进行分析。
27.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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