C++ 在超类构造函数中引用时调用哪个公共函数?
我想知道一个执行顺序的问题:如果我有一个类,它的构造函数调用自己的函数C++ 在超类构造函数中引用时调用哪个公共函数?,c++,class,inheritance,overriding,C++,Class,Inheritance,Overriding,我想知道一个执行顺序的问题:如果我有一个类,它的构造函数调用自己的函数f(),然后生成一个子类覆盖该函数并调用超类的构造函数,哪个f()被执行 为了回答这个问题,我写了这个程序: #include <iostream> using namespace std; class Super { public: Super(); void f(); }; class Sub : public Super { public: Sub(); void f();
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;
}
我得到以下错误输出:
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
显然是一种类类型。我错过了什么?当超级类构造函数运行时,它只看到对象的超级类部分。因此,当Super
的构造函数运行时,它将对象视为Super
类型的对象,因此它将调用Super::f
至于你的错误,
Sub()
声明一个函数sub
,该函数返回类型为sub
的对象。您要做的是创建一个对象sub
。要做到这一点,您可以这样声明Sub代码>或者,如果您使用的是C++11,像这样:Sub{}代码>。这同样适用于Super()
Sub()
是一个函数声明。当超级类构造函数运行时,对象是超级类,因此超级类函数将运行。super super()
声明一个函数,将其更改为Super
,与Sub()相同
。此外,由于f
不是虚拟的,所以超类one无论如何都会运行。
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();
^