在超类构造函数中引用时调用哪个 public 函数?

Which public function is called when referenced in superclass constructor?

我想知道执行顺序的问题:如果我有一个 class,其构造函数调用其自身的一个函数 f(),然后创建一个覆盖该函数的子 class并调用 superclass' 构造函数,执行 f()?

为了回答这个问题,我写了这个程序:

#include <iostream>

using namespace std;

class Super
{
public:
  Super();

  void
  f();
};

class Sub : public Super
{
public:
  Sub();

  void
  f();
};

Super::Super()
{
  this->f();
}

void
Super::f()
{
  cout << "hello" << endl;
}

Sub::Sub()
  : Super()
{
}

void
Sub::f()
{
  cout << "world" << endl;
}

int
main()
{
  Super super();
  Sub sub();

  sub.f();

  return 0;
}

最初,我没有在 main() 中包含 sub.f() 调用,但程序除了退出代码 0 外什么也没做,所以我将其添加到测试中。现在,当我用

编译时
g++ -Wall -o super super.cpp

我得到这个错误输出:

super.cpp: In function ‘int main()’:
super.cpp:51:7: error: request for member ‘f’ in ‘sub’, which is of non-class type ‘Sub()’
   sub.f();
       ^

现在我更糊涂了。 Sub 显然是 class 类型。我错过了什么?

当超级 class 构造函数是 运行 时,它只看到对象的超级 class 部分。因此,当 Super 的构造函数运行时,它将对象视为类型 Super 的对象,因此它将调用 Super::f.

至于你的错误,Sub sub(); 声明了一个函数 sub,其中 returns 是一个 Sub 类型的对象。你想要的是创建一个对象sub。为此,您可以像这样声明它 Sub sub; 或者,如果您使用的是 C++11,则像这样:Sub sub{};。这同样适用于 Super super();.