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

时间:2016-01-27 01:03:06

标签: c++ class inheritance override

我想知道执行顺序的问题:如果我有一个类,其构造函数调用自身的函数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;
}

最初,我没有在sub.f()中添加main()来电,但该程序除了退出代码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显然是一种类型。我错过了什么?

1 个答案:

答案 0 :(得分:1)

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

至于您的错误,Sub sub();声明了一个函数sub,它返回Sub类型的对象。你想要的是创建一个对象sub。要执行此操作,您可以将其声明为Sub sub;,或者,如果您使用的是C ++ 11,则如下所示:Sub sub{};。这同样适用于Super super();