提问者:小点点

为什么在C++中派生类构造函数必须调用基类构造函数?


为什么在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;
}

共3个答案

匿名用户

C++的一个基本原则是用户定义类型的确定性初始化和去初始化的重要性。 这可以说是这门语言最引人注目的特点。

因此编译器必须在可能的情况下强制执行初始化和解初始化。 C++不会让我们轻易得到一个半生不熟的对象。 在维护类不变量时,这是一件好事。 我们需要编译器的帮助来确保这些都得到维护。

其他语言(如Python,其中基的初始化需要显式)可能会选择其他设计准则,但C++遵循自己的设计准则。

匿名用户

派生类继承基类的所有成员。 创建派生类的实例时,将调用基类构造函数来初始化相应的成员。

匿名用户

一个派生类将要继承基类,这意味着基类的函数需要在这个派生类中使用。 否则继承将变得毫无意义。

如果不调用基类的构造函数,则基类的成员函数可能无法工作。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|派生类|构造|函数|调用|基|类|构造|函数)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?