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

3
class A {
    A() { }
};

class B : public A {
    B() : A() { }
};

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

2
隐式并不意味着你无法显式地去做,只是因为你想要这样做。 - user180247
4个回答

11

这是隐式的。如果A有带参数的构造函数,那么你需要使用这种语法来传递参数。


1
酷炫的技巧:有时候我不想调用父类的构造函数(可能有些信息是该类不能没有的),所以我将其设置为私有。这样做的话,每次都要显式地调用正确的父类构造函数,即使在子类的默认构造函数中也是如此。 - thebretness

8

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

只有在基类没有默认构造函数或者你想调用不同于默认构造函数的构造函数时才需要显式调用构造函数。

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


2

只有在A类的构造函数需要额外的参数时才需要使用。在你的示例中,不需要显式调用基类的构造函数。


0
在你所展示的情况下,这并不是必要的。考虑以下内容:
class A 
{
private:
    int m_i;

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

这段代码无法工作(无法编译),因为 A 没有默认构造函数。在这种情况下,您必须使用适当的参数显式调用基类构造函数。

另一种需要显式调用构造函数的情况是基类有多个构造函数。在这种情况下,您可以显式调用合适的构造函数。


挑剔一下:移除 B(): 中的冒号 :) - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接