为什么派生构造函数强制调用 C++ 中的基构造函数?
Why is a derived constructor forced to call a base constructor in C++?
为什么派生的 class 构造函数被迫调用 C++ 中的基础 class 构造函数(隐式或显式)?
例如:
#include <iostream>
struct B1 {
B1() { std::cout << "B1"; }
};
struct B2 {
B2(int x) { std::cout << "B2"; }
};
struct D1: B1 {
D1() { std::cout << "D1"; } // implicitly calls B1::B1
};
struct D2: B2 {
D2(int x): B2(x) { std::cout << "D2"; } // explicitly calls B2::B2
};
int main() {
D1 d1 {}; // prints B1D1
D2 d2 {5}; // prints B2D2
return 0;
}
派生 class 继承基础 class 的所有成员。当您创建派生 class 的实例时,将调用基础 class 构造函数来初始化相应的成员。
一个派生class要继承基class,也就是说基class的功能需要在这个派生class中使用。否则继承就没有意义了。
如果不调用基class的构造函数,基class的成员函数可能无法工作
C++ 的主要内容之一是确定性初始化和取消初始化对用户定义类型的重要性。它可以说是该语言最引人注目的特性。
所以编译器会尽可能强制执行初始化和取消初始化。 C++不会让我们轻易得到一个半生不熟的对象。在维护 class 不变量时这是一件好事。我们需要编译器的帮助来确保这些得到维护。
其他语言(例如 Python,其中基类的初始化需要显式)可能会选择其他设计指南,但 C++ 遵循自己的设计指南。
为什么派生的 class 构造函数被迫调用 C++ 中的基础 class 构造函数(隐式或显式)?
例如:
#include <iostream>
struct B1 {
B1() { std::cout << "B1"; }
};
struct B2 {
B2(int x) { std::cout << "B2"; }
};
struct D1: B1 {
D1() { std::cout << "D1"; } // implicitly calls B1::B1
};
struct D2: B2 {
D2(int x): B2(x) { std::cout << "D2"; } // explicitly calls B2::B2
};
int main() {
D1 d1 {}; // prints B1D1
D2 d2 {5}; // prints B2D2
return 0;
}
派生 class 继承基础 class 的所有成员。当您创建派生 class 的实例时,将调用基础 class 构造函数来初始化相应的成员。
一个派生class要继承基class,也就是说基class的功能需要在这个派生class中使用。否则继承就没有意义了。
如果不调用基class的构造函数,基class的成员函数可能无法工作
C++ 的主要内容之一是确定性初始化和取消初始化对用户定义类型的重要性。它可以说是该语言最引人注目的特性。
所以编译器会尽可能强制执行初始化和取消初始化。 C++不会让我们轻易得到一个半生不熟的对象。在维护 class 不变量时这是一件好事。我们需要编译器的帮助来确保这些得到维护。
其他语言(例如 Python,其中基类的初始化需要显式)可能会选择其他设计指南,但 C++ 遵循自己的设计指南。