MST

星途 面试题库

面试题:C++构造函数非虚特性与多态性在复杂继承结构下对对象创建的综合影响

假设有一个C++的多重继承结构,基类A、B,派生类C继承自A和B,类D又继承自C。每个类都有构造函数,且A、B类中有虚函数。阐述在创建D类对象时,构造函数的执行顺序以及构造函数非虚特性如何与多态性相互作用。同时,说明如果在构造函数中调用虚函数,可能会出现什么问题,为什么?
38.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 构造函数执行顺序

    • 首先执行基类A的构造函数。
    • 接着执行基类B的构造函数。
    • 然后执行类C的构造函数,因为C继承自AB
    • 最后执行类D的构造函数,因为D继承自C
  2. 构造函数非虚特性与多态性的相互作用

    • 构造函数是非虚的。在创建对象时,首先调用基类构造函数,此时对象的类型被视为基类类型。随着构造函数从基类到派生类依次执行,对象逐步构建为完整的派生类对象。在构造函数执行期间,多态性机制并不会按照运行时类型来调用函数。这是因为在构造函数执行时,对象还没有完全构建完成,如果按照运行时类型来调用虚函数,可能会访问到未初始化的成员变量等问题。所以,在构造函数中调用虚函数,实际调用的是当前类(即正在执行构造函数的类)的版本,而不是派生类重写的版本,这确保了对象在构造过程中的一致性和安全性。
  3. 在构造函数中调用虚函数的问题及原因

    • 问题:在构造函数中调用虚函数,不会调用到派生类中重写的虚函数版本,而是调用当前类的虚函数版本,这可能导致与预期不符的行为。
    • 原因:当基类构造函数执行时,派生类部分还未初始化。如果在基类构造函数中调用虚函数,若该虚函数依赖于派生类特有的成员变量或行为,而此时这些派生类部分还未初始化,就会导致程序出现错误,如访问未初始化的内存等。所以C++ 规定在构造函数中调用虚函数不会表现出多态性,以保证对象构造过程的正确性。