MST

星途 面试题库

面试题:C++ 中构造函数非虚特性在继承体系下对对象创建的影响

在C++中,已知有一个基类Base和一个派生类Derived,Derived继承自Base。Base类有一个构造函数和一个虚函数print。Derived类重写了print函数。请说明在创建Derived类对象时,构造函数的调用顺序是怎样的,并且解释构造函数非虚特性在这个过程中是如何体现的,对对象的虚函数调用有什么影响?
19.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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