【问题标题】:how to force base class constructors to be called in derived classes?如何强制在派生类中调用基类构造函数?
【发布时间】:2012-04-03 21:16:58
【问题描述】:

我相当确定基本的 c++ 问题。如果我有一个带有不带参数的构造函数的基类,并且只初始化一些受保护的成员,如果派生类与参数匹配(希望但不太可能的想法),派生类是否也会立即调用此基构造函数,如果不是,是有没有办法强制它从派生类中自动调用所述基构造函数,而不必在派生类中明确告诉它这样做?我问是因为我正在编写某种包装器,并且有一些受保护的成员我想最初初始化为特定值,然后我想根据我的需要派生和操作这个基类,但我不喜欢外部用户必须记住显式调用基本构造函数或在它们自己的构造函数中设置这些值。

【问题讨论】:

  • 我对你的问题的措辞有点迷茫,但如果基类有一个默认/无参数构造函数,如果你不初始化派生类对象,它将被调用显式指定基类的初始化。

标签: c++


【解决方案1】:

是的,除非另有明确说明,否则始终调用默认的基本构造函数。

例如:

class A
{
public:
   A() { std::cout << "A"; }
};

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

int main()
{
   B b;
   return 0;
}

将输出:

A

“明确说明”是指您可以从派生类调用不同的构造函数:

class A
{
public:
   A() { std::cout << "A"; }
   A(int) { std::cout << "AAA"; }
};

class B : A
{
public:
   B() : A(1) {}  //call A(int)
};

int main()
{
   B b;
   return 0;
}

会输出

AAA

重要如果您没有默认构造函数(您声明了非默认构造函数而不是默认构造函数)或默认构造函数不可见(标记为private),您需要在派生类中显式调用可用的构造函数。

【讨论】:

  • 假设唯一的构造函数类 A 具有接收整数作为参数,然后派生类具有接收单个 int 的构造函数。基础构造函数也会被偶然调用吗?还是仅在没有参数的情况下才将构造函数视为默认构造函数?
  • 另外,最后想一想,如果反之亦然,您在 B 中定义了一个带参数的构造函数,但在 A 中定义了一个无参数构造函数,会调用 A 的构造函数吗?还有,首先调用的是基类的默认构造函数或派生类的默认构造函数。
【解决方案2】:

如果你的基类有一个“默认构造函数”(一个不带参数的构造函数;要么由你显式提供,要么由编译器隐式提供,因为你没有显式提供任何构造函数),那么每个派生类除非您指定它们调用不同的构造函数,否则构造函数将自动调用它。

(如果你的基类 没有 有一个“默认构造函数”,因为你提供了一个或多个带参数的构造函数而没有不带参数的构造函数,那么它就是一个编译器-派生类构造函数的错误不指示它调用的基类构造函数。)

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 2016-07-19
    • 2014-03-26
    • 2018-07-21
    • 2013-06-23
    • 2010-12-26
    • 2015-08-18
    • 2018-07-16
    • 2011-09-27
    相关资源
    最近更新 更多