我想知道执行顺序的问题:如果我有一个类,其构造函数调用自身的函数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
显然是一种类型。我错过了什么?
答案 0 :(得分:1)
当超类构造函数运行时,它只会看到作为超类的对象部分。因此,当Super
的构造函数运行时,它会将对象视为Super
类型的对象,因此它将调用Super::f
。
至于您的错误,Sub sub();
声明了一个函数sub
,它返回Sub
类型的对象。你想要的是创建一个对象sub
。要执行此操作,您可以将其声明为Sub sub;
,或者,如果您使用的是C ++ 11,则如下所示:Sub sub{};
。这同样适用于Super super();
。