MST

星途 面试题库

面试题:C++模板编程中虚基类的初始化顺序问题

在C++模板编程中,假设有多个类继承自同一个虚基类,描述一下虚基类的初始化顺序是怎样的,并举例说明如何确保初始化的正确性。
20.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 虚基类初始化顺序
    • 在C++中,当有多个类继承自同一个虚基类时,虚基类总是由最终派生类初始化,而不是由它的直接派生类初始化。这意味着无论虚基类在继承体系中出现多深,或者有多少个中间派生类,最终派生类都负责初始化虚基类。
    • 初始化顺序是在所有非虚基类之前进行初始化。
  2. 举例确保初始化正确性
#include <iostream>

class VirtualBase {
public:
    int value;
    VirtualBase(int v) : value(v) {
        std::cout << "VirtualBase constructor with value: " << value << std::endl;
    }
};

class Derived1 : virtual public VirtualBase {
public:
    Derived1(int v) : VirtualBase(v) {
        std::cout << "Derived1 constructor" << std::endl;
    }
};

class Derived2 : virtual public VirtualBase {
public:
    Derived2(int v) : VirtualBase(v) {
        std::cout << "Derived2 constructor" << std::endl;
    }
};

class FinalDerived : public Derived1, public Derived2 {
public:
    FinalDerived(int v) : VirtualBase(v), Derived1(v), Derived2(v) {
        std::cout << "FinalDerived constructor" << std::endl;
    }
};

int main() {
    FinalDerived fd(42);
    return 0;
}

在上述代码中:

  • VirtualBase是虚基类。Derived1Derived2都虚继承自VirtualBaseFinalDerivedDerived1Derived2派生。
  • FinalDerived的构造函数初始化列表中,明确地调用VirtualBase的构造函数,确保虚基类被正确初始化。如果FinalDerived的构造函数初始化列表中不调用VirtualBase的构造函数,编译器会报错,因为它要求最终派生类负责初始化虚基类。这样就保证了虚基类初始化的正确性。