MST
星途 面试题库

面试题:C++虚基类构造调用时机在复杂继承体系中的分析

假设有如下C++类继承体系:类A是虚基类,类B和类C都虚继承于A,类D同时继承自B和C。请详细分析在创建D类对象时,A、B、C的构造函数调用顺序,并解释为什么是这样的顺序。如果在这个过程中,A、B、C的构造函数都有参数,应该如何确保参数正确传递给虚基类A的构造函数?
28.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 构造函数调用顺序
    • 当创建D类对象时,构造函数调用顺序为:先调用虚基类A的构造函数,然后调用B的构造函数,接着调用C的构造函数,最后调用D的构造函数。
    • 原因:在C++中,虚继承的目的是为了避免多重继承时虚基类的重复实例化。由于BC都虚继承于A,在创建D类对象时,为了保证A只有一个实例,所以A的构造函数会在BC之前被调用。而BC作为D的直接基类,它们的构造函数按照继承列表中出现的顺序依次调用(即先BC),最后调用D自身的构造函数。
  2. 参数传递给虚基类A的构造函数
    • 应该在D类的构造函数初始化列表中直接调用虚基类A的构造函数,并传递相应的参数。例如:
class A {
public:
    A(int a) { /* 构造函数实现 */ }
};
class B : virtual public A {
public:
    B(int a, int b) : A(a) { /* 构造函数实现 */ }
};
class C : virtual public A {
public:
    C(int a, int c) : A(a) { /* 构造函数实现 */ }
};
class D : public B, public C {
public:
    D(int a, int b, int c) : A(a), B(a, b), C(a, c) { /* 构造函数实现 */ }
};
  • 在上述代码中,D类的构造函数通过初始化列表直接调用A的构造函数并传递参数a。这样可以确保虚基类A在初始化时能获得正确的参数,同时BC的构造函数也可以从D的构造函数中获取传递给A的参数,从而保证整个继承体系构造的正确性。