面试题答案
一键面试-
构造函数调用顺序:
- 首先调用基类
A
的构造函数。这是因为在创建派生类对象时,必须先构建其基类部分,为派生类对象提供基础的状态。 - 然后调用类
C
的构造函数。因为类C
是类B
的成员对象,在类B
自身构造函数执行前,需要先初始化其成员对象。 - 最后调用类
B
的构造函数。
- 首先调用基类
-
处理依赖关系及代码示例:
- 可以通过在类
B
的构造函数初始化列表中传递类A
中初始化后的数据给类C
的构造函数来处理这种依赖关系。
- 可以通过在类
#include <iostream>
class A {
public:
int data;
A() : data(10) {
std::cout << "A constructor called." << std::endl;
}
};
class C {
public:
int value;
C(int initValue) : value(initValue) {
std::cout << "C constructor called with value: " << value << std::endl;
}
};
class B : public A {
private:
C c;
public:
B() : c(data) {
std::cout << "B constructor called." << std::endl;
}
};
int main() {
B b;
return 0;
}
详细解释:
- 在上述代码中,类
A
有一个成员变量data
并在其构造函数中初始化。 - 类
C
的构造函数接受一个参数并初始化value
成员变量。 - 类
B
继承自A
并包含一个C
类型的成员对象c
。在类B
的构造函数初始化列表中,将类A
中已初始化的data
传递给类C
的构造函数,这样确保了类C
可以使用类A
初始化后的数据。 - 在
main
函数中创建B
类对象b
时,构造函数的调用顺序为先A
,再C
,最后B
,并且类C
正确获取到了类A
初始化后的数据。