C++ 显式调用基类构造函数的重要性是什么?

C++ 显式调用基类构造函数的重要性是什么?,c++,C++,为什么我们需要在B的构造函数中显式调用基类的构造函数?它不是隐式的吗?它是隐式的。如果A的构造函数有参数,则需要此语法,这是传递参数的方法。只有在A的构造函数需要额外参数时才需要此语法。在您的示例中,没有必要显式调用基类的构造函数。这是隐式的,没有必要的。如果不显式调用基类构造函数,则使用默认构造函数(不带参数的构造函数) 如果基类没有默认构造函数,或者您希望调用与默认构造函数不同的构造函数,则只需要显式调用构造函数 为了清楚起见,仍然可以添加对基类构造函数的显式调用,但这不是必需的。在前面的例

为什么我们需要在
B
的构造函数中显式调用基类的构造函数?它不是隐式的吗?

它是隐式的。如果A的构造函数有参数,则需要此语法,这是传递参数的方法。

只有在A的构造函数需要额外参数时才需要此语法。在您的示例中,没有必要显式调用基类的构造函数。

这是隐式的,没有必要的。如果不显式调用基类构造函数,则使用默认构造函数(不带参数的构造函数)

如果基类没有默认构造函数,或者您希望调用与默认构造函数不同的构造函数,则只需要显式调用构造函数


为了清楚起见,仍然可以添加对基类构造函数的显式调用,但这不是必需的。

在前面的例子中,这不是必需的。考虑以下事项:

class A {
    A() { }
};

class B : public A {
    B() : A() { }
};
这将不起作用(不会编译),因为不再有
a
的默认构造函数。在这种情况下,必须使用适当的参数显式调用基类构造函数


当基类有多个构造函数时,可能需要显式调用构造函数。在这种情况下,您可以显式地调用有意义的函数。

隐式并不意味着您无论如何都不能显式地调用它,仅仅因为您想这样做。挑剔:删除
B():
:)中的
)很酷的技巧:有时我不希望调用父类的构造函数(可能有一些信息该类无法运行),所以我把它保密。当我这样做时,我每次都必须显式地调用适当的父构造函数,即使在子构造函数的默认构造函数中也是如此。
class A 
{
private:
    int m_i;

public:
    A(int i) 
      : m_i(i)
    { 
    } 
}; 
class B:public A 
{ 
public:
    B()
    { 
    } 
};