如果您不为具有不同签名的不同派生构造函数调用基 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 .
假设我有一个基础和派生的 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 .