6

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

4

2 回答 2

7

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

例如:

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),则需要在派生类中显式调用可用的构造函数。

于 2012-04-03T21:20:23.447 回答
2

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

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

于 2012-04-03T21:20:52.080 回答