MST

星途 面试题库

面试题:C++ 虚基类构造调用顺序相关基础

请阐述在C++中,含有虚基类的继承体系下,构造函数调用顺序的一般规则,并举例说明。
28.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 一般规则
    • 首先调用虚基类的构造函数,若虚基类有多个,按照它们在继承列表中出现的顺序依次调用。
    • 然后调用非虚基类的构造函数,若有多个非虚基类,同样按照它们在继承列表中出现的顺序依次调用。
    • 接着调用类自身的成员变量的构造函数,按照成员变量声明的顺序调用。
    • 最后调用类自身的构造函数体。
  2. 示例代码
#include <iostream>

class VirtualBase {
public:
    VirtualBase() {
        std::cout << "VirtualBase constructor called." << std::endl;
    }
};

class Base1 : virtual public VirtualBase {
public:
    Base1() {
        std::cout << "Base1 constructor called." << std::endl;
    }
};

class Base2 : virtual public VirtualBase {
public:
    Base2() {
        std::cout << "Base2 constructor called." << std::endl;
    }
};

class Derived : public Base1, public Base2 {
public:
    Derived() {
        std::cout << "Derived constructor called." << std::endl;
    }
};

int main() {
    Derived d;
    return 0;
}

在上述代码中,Derived类继承自Base1Base2,而Base1Base2都虚继承自VirtualBase。当创建Derived类的对象d时,构造函数的调用顺序为:

  • VirtualBase构造函数被调用,因为它是虚基类。
  • Base1构造函数被调用,Base1是非虚基类,在继承列表中先出现。
  • Base2构造函数被调用,Base2是非虚基类,在继承列表中后出现。
  • Derived构造函数被调用。

运行上述代码,输出结果为:

VirtualBase constructor called.
Base1 constructor called.
Base2 constructor called.
Derived constructor called.