【发布时间】: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