C++ 在超类构造函数中引用时调用哪个公共函数?

C++ 在超类构造函数中引用时调用哪个公共函数?,c++,class,inheritance,overriding,C++,Class,Inheritance,Overriding,我想知道一个执行顺序的问题:如果我有一个类,它的构造函数调用自己的函数f(),然后生成一个子类覆盖该函数并调用超类的构造函数,哪个f()被执行 为了回答这个问题,我写了这个程序: #include <iostream> using namespace std; class Super { public: Super(); void f(); }; class Sub : public Super { public: Sub(); void f();

我想知道一个执行顺序的问题:如果我有一个类,它的构造函数调用自己的函数
f()
,然后生成一个子类覆盖该函数并调用超类的构造函数,哪个
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;
}
我得到以下错误输出:

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
显然是一种类类型。我错过了什么?

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


至于你的错误,
Sub()
声明一个函数
sub
,该函数返回类型为
sub
的对象。您要做的是创建一个对象
sub
。要做到这一点,您可以这样声明
Sub或者,如果您使用的是C++11,像这样:
Sub{}。这同样适用于
Super()

Sub()
是一个函数声明。当超级类构造函数运行时,对象是超级类,因此超级类函数将运行。
super super()
声明一个函数,将其更改为
Super
,与
Sub()相同
。此外,由于
f
不是虚拟的,所以超类one无论如何都会运行。
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();
       ^