在超类构造函数中引用时调用哪个 public 函数?
Which public function is called when referenced in superclass constructor?
我想知道执行顺序的问题:如果我有一个 class,其构造函数调用其自身的一个函数 f()
,然后创建一个覆盖该函数的子 class并调用 superclass' 构造函数,执行 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
显然是 class 类型。我错过了什么?
当超级 class 构造函数是 运行 时,它只看到对象的超级 class 部分。因此,当 Super
的构造函数运行时,它将对象视为类型 Super
的对象,因此它将调用 Super::f
.
至于你的错误,Sub sub();
声明了一个函数 sub
,其中 returns 是一个 Sub
类型的对象。你想要的是创建一个对象sub
。为此,您可以像这样声明它 Sub sub;
或者,如果您使用的是 C++11,则像这样:Sub sub{};
。这同样适用于 Super super();
.
我想知道执行顺序的问题:如果我有一个 class,其构造函数调用其自身的一个函数 f()
,然后创建一个覆盖该函数的子 class并调用 superclass' 构造函数,执行 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
显然是 class 类型。我错过了什么?
当超级 class 构造函数是 运行 时,它只看到对象的超级 class 部分。因此,当 Super
的构造函数运行时,它将对象视为类型 Super
的对象,因此它将调用 Super::f
.
至于你的错误,Sub sub();
声明了一个函数 sub
,其中 returns 是一个 Sub
类型的对象。你想要的是创建一个对象sub
。为此,您可以像这样声明它 Sub sub;
或者,如果您使用的是 C++11,则像这样:Sub sub{};
。这同样适用于 Super super();
.