面试题答案
一键面试- 构造函数调用顺序:
- 首先调用基类
Base
的构造函数。这是因为在创建派生类对象时,派生类对象中包含基类部分,需要先初始化基类部分的数据成员等。 - 然后调用派生类
Derived
的构造函数。这样才能完成整个派生类对象的初始化。
- 首先调用基类
- 构造函数非虚特性体现:
- 构造函数不能是虚函数。当创建
Derived
类对象时,在调用基类Base
构造函数期间,对象的类型被认为是Base
类型,而不是Derived
类型。这是因为此时派生类部分还未初始化,只有基类部分正在初始化过程中。所以在基类构造函数执行时,虚函数机制尚未完全建立起来,不能调用到派生类中重写的虚函数。
- 构造函数不能是虚函数。当创建
- 对对象虚函数调用的影响:
- 在基类构造函数执行期间,若调用虚函数
print
,调用的是基类版本的print
函数,而不是派生类重写的版本。这是因为在基类构造函数中,对象的虚函数表指针(如果存在)指向的是基类的虚函数表。只有在基类构造完成,进入派生类构造函数执行后,对象的虚函数表指针才会正确指向派生类的虚函数表,此时如果调用虚函数print
,才会调用到派生类重写的版本。
- 在基类构造函数执行期间,若调用虚函数