为什么在C++中派生类构造函数强制调用基类构造函数(隐式或显式)?
例如:
#include <iostream>
struct B1 {
B1() { std::cout << "B1" << std::endl; }
};
struct B2 {
B2(int x) { std::cout << "B2" << std::endl; }
};
struct D1: B1 {
D1() { std::cout << "D1" << std::endl; } // implicit call to B1::B1
};
struct D2: B2 {
D2(int x): B2(x) { std::cout << "D2" << std::endl; } // explicit call to B2::B2
};
int main() {
D1 d1 {};
D2 d2 {5};
return 0;
}
C++的一个基本原则是用户定义类型的确定性初始化和去初始化的重要性。 这可以说是这门语言最引人注目的特点。
因此编译器必须在可能的情况下强制执行初始化和解初始化。 C++不会让我们轻易得到一个半生不熟的对象。 在维护类不变量时,这是一件好事。 我们需要编译器的帮助来确保这些都得到维护。
其他语言(如Python,其中基的初始化需要显式)可能会选择其他设计准则,但C++遵循自己的设计准则。
派生类继承基类的所有成员。 创建派生类的实例时,将调用基类构造函数来初始化相应的成员。
一个派生类将要继承基类,这意味着基类的函数需要在这个派生类中使用。 否则继承将变得毫无意义。
如果不调用基类的构造函数,则基类的成员函数可能无法工作。