我有一个基础和派生类的应用程序。我需要在派生类中有一个基类的字段,但是在初始化它时会遇到一些问题。这是代码:
#include <iostream>
using namespace std;
class X
{
public :
X( int x ) { }
} ;
class Y : public X
{
X x ;
Y* y ;
Y( int a ) : x( a ) { }
} ;
int main()
{
return 0;
}
错误:
/tmp/test.cpp||In constructor ‘Y::Y(int)’:|
/tmp/test.cpp|14|error: no matching function for call to ‘X::X()’|
/tmp/test.cpp|14|note: candidates are:|
/tmp/test.cpp|7|note: X::X(int)|
/tmp/test.cpp|7|note: candidate expects 1 argument, 0 provided|
/tmp/test.cpp|4|note: X::X(const X&)|
/tmp/test.cpp|4|note: candidate expects 1 argument, 0 provided|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
答案 0 :(得分:8)
您需要调用超类构造函数,因为默认构造函数不可用:
Y( int a ) : X(some_int_like_maybe_a), x( a ) { }
另请考虑将X::X(int)
标记为explicit
。
答案 1 :(得分:5)
错误的原因是您没有构建X
的{{1}}部分。由于Y
继承自Y
,因此您需要构建X
的{{1}}部分。既然你没有,编译器会为你做。当它执行此操作时,它使用默认构造函数,X
没有,因此您会收到错误。你需要像
Y
构建X
的{{1}}部分和Y( int a ) : X(some_value), x( a ) { }
的{{1}}成员。或者你可以为X添加一个默认构造函数,让它默认构造。