面试题答案
一键面试复杂性
- 多重继承路径:在多重继承中,一个类可能通过多条路径继承自虚基类。例如,
class D : public B, public C
,其中B
和C
都继承自虚基类A
。这就可能导致构造函数参数传递的模糊性,因为不知道从哪个路径传递的参数才是有效的。 - 初始化顺序:虚基类的初始化必须在非虚基类之前进行。但在复杂的继承层次结构中,确保虚基类在正确的时机被初始化,并获得正确的参数值并非易事。
确保正确调用及参数传递
- 在最底层派生类中显式调用虚基类构造函数:在最底层派生类的构造函数初始化列表中,直接调用虚基类的构造函数,这样可以确保虚基类构造函数只被调用一次,并且获得合适的参数值。
代码示例
#include <iostream>
// 虚基类
class A {
public:
A(int value) : data(value) {
std::cout << "A constructor: " << data << std::endl;
}
int data;
};
// 继承自虚基类A
class B : virtual public A {
public:
B(int value) : A(value) {
std::cout << "B constructor" << std::endl;
}
};
// 继承自虚基类A
class C : virtual public A {
public:
C(int value) : A(value) {
std::cout << "C constructor" << std::endl;
}
};
// 多重继承自B和C
class D : public B, public C {
public:
D(int value) : A(value), B(value), C(value) {
std::cout << "D constructor" << std::endl;
}
};
int main() {
D d(10);
std::cout << "d.data: " << d.data << std::endl;
return 0;
}
在上述代码中:
A
是虚基类,B
和C
通过virtual
关键字虚继承自A
。D
多重继承自B
和C
。- 在
D
的构造函数初始化列表中,显式调用A
的构造函数,传递参数value
,这样确保A
被正确初始化且只被初始化一次。B
和C
的构造函数也从D
的构造函数初始化列表中调用,它们也传递相同的参数value
给A
,但由于A
是虚基类,实际只会调用一次A
的构造函数。