如果您不为具有不同签名的不同派生构造函数调用基 class 的构造函数,会发生什么情况?

What happens if you don't call a base class's constructor for different derived constructors with different signatures?

假设我有一个基础和派生的 class 像这样:

class Base {
public:
    Base() { ... };
    Base(int param) { ... };
};

class Derived : public Base {
public:
    Derived() { ... };
    Derived(int param) { ... };
    Derived(int p1, int p2) { ... };
};

请注意,我 不是 Derived 的构造函数显式调用任何 Base 的构造函数。也就是说,我没有Derived() : Base() { ... }Derived(int param) : Base(param) { ... }

在创建 Derived 的实例时,是否会默认调用 Base 的任何构造函数?

如果是这样,使用 Derived(int param) 时会调用 Base(int param),还是调用 Base()

换句话说,如果您不指定要使用哪个构造函数,C++ 是否总是默认使用与派生 class 的构造函数具有相同签名的基础 class 构造函数?或者它只是使用基础 class 的默认构造函数?

如果是前者,那么当在派生 class 中使用构造函数时,在基础 class 中没有具有相同签名的匹配构造函数怎么办,例如 Derived(int p1, int p2)?

请注意这个问题涉及class的成员变量的初始化。我故意不在我的伪代码中包含任何成员变量。如果您没有在派生的 class 的构造函数中明确指定基构造函数 ,则它特别与使用基 class 上的哪个构造函数有关 。 =22=]

引用 cppreference 的 description 构造函数以及继承与它们的关系:

Before the compound statement that forms the function body of the constructor begins executing, initialization of all direct bases, virtual bases, and non-static data members is finished. Member initializer list is the place where non-default initialization of these objects can be specified. For bases and non-static data members that cannot be default-initialized, such as members of reference and const-qualified types, member initializers must be specified. No initialization is performed for anonymous unions or variant members that do not have a member initializer.

(强调已添加。)

如果您没有在派生 class 的构造函数的成员初始化列表中指定基 class 子对象的初始化,则基 class 子对象是 default-initialized .