面试题答案
一键面试- 虚基类初始化顺序:
- 在C++中,当有多个类继承自同一个虚基类时,虚基类总是由最终派生类初始化,而不是由它的直接派生类初始化。这意味着无论虚基类在继承体系中出现多深,或者有多少个中间派生类,最终派生类都负责初始化虚基类。
- 初始化顺序是在所有非虚基类之前进行初始化。
- 举例确保初始化正确性:
#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
是虚基类。Derived1
和Derived2
都虚继承自VirtualBase
。FinalDerived
从Derived1
和Derived2
派生。- 在
FinalDerived
的构造函数初始化列表中,明确地调用VirtualBase
的构造函数,确保虚基类被正确初始化。如果FinalDerived
的构造函数初始化列表中不调用VirtualBase
的构造函数,编译器会报错,因为它要求最终派生类负责初始化虚基类。这样就保证了虚基类初始化的正确性。