MST

星途 面试题库

面试题:C++构造函数调用顺序在复杂继承与成员对象场景下的影响

考虑一个C++程序,有类A作为基类,类B继承自A,类B中包含一个类C的成员对象。类A、B、C都有各自的构造函数。当在主函数中创建一个B类对象时,详细说明构造函数的调用顺序。如果类C的构造函数需要类A中初始化后的数据才能正确执行,你如何设计程序以确保这种依赖关系能正确处理?请给出代码示例及详细解释。
17.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 构造函数调用顺序

    • 首先调用基类 A 的构造函数。这是因为在创建派生类对象时,必须先构建其基类部分,为派生类对象提供基础的状态。
    • 然后调用类 C 的构造函数。因为类 C 是类 B 的成员对象,在类 B 自身构造函数执行前,需要先初始化其成员对象。
    • 最后调用类 B 的构造函数。
  2. 处理依赖关系及代码示例

    • 可以通过在类 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 初始化后的数据。