【问题标题】:Which public function is called when referenced in superclass constructor?在超类构造函数中引用时调用哪个公共函数?
【发布时间】:2016-01-27 01:03:05
【问题描述】:

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

最初,我没有在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 显然是一个类类型。我错过了什么?

【问题讨论】:

  • Sub sub() 是一个函数声明。
  • 超类构造函数运行时,对象超类,所以超类函数会运行。
  • Super super();声明一个函数,改成Super super;,和Sub sub();一样。
  • 另外,由于f 不是虚拟的,超类无论如何都会运行。

标签: c++ class inheritance overriding


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-19
    • 2015-01-05
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多