面试题答案
一键面试-
构造函数执行顺序:
- 首先执行基类
A
的构造函数。 - 接着执行基类
B
的构造函数。 - 然后执行类
C
的构造函数,因为C
继承自A
和B
。 - 最后执行类
D
的构造函数,因为D
继承自C
。
- 首先执行基类
-
构造函数非虚特性与多态性的相互作用:
- 构造函数是非虚的。在创建对象时,首先调用基类构造函数,此时对象的类型被视为基类类型。随着构造函数从基类到派生类依次执行,对象逐步构建为完整的派生类对象。在构造函数执行期间,多态性机制并不会按照运行时类型来调用函数。这是因为在构造函数执行时,对象还没有完全构建完成,如果按照运行时类型来调用虚函数,可能会访问到未初始化的成员变量等问题。所以,在构造函数中调用虚函数,实际调用的是当前类(即正在执行构造函数的类)的版本,而不是派生类重写的版本,这确保了对象在构造过程中的一致性和安全性。
-
在构造函数中调用虚函数的问题及原因:
- 问题:在构造函数中调用虚函数,不会调用到派生类中重写的虚函数版本,而是调用当前类的虚函数版本,这可能导致与预期不符的行为。
- 原因:当基类构造函数执行时,派生类部分还未初始化。如果在基类构造函数中调用虚函数,若该虚函数依赖于派生类特有的成员变量或行为,而此时这些派生类部分还未初始化,就会导致程序出现错误,如访问未初始化的内存等。所以C++ 规定在构造函数中调用虚函数不会表现出多态性,以保证对象构造过程的正确性。