我是c++的新手。当我尝试编译下面的代码时,我得到了这个错误
constructor for 'child' must explicitly initialize the base class 'parent' which does not have a default constructor child::child(int a) {
这是我的班级
#include<iostream>
using namespace std;
class Parent
{
public :
int x;
Parent(int a);
int getX();
};
Parent::Parent(int a)
{
x = a;
}
int Parent::getX()
{
return x;
}
class Child : public Parent
{
public:
Child(int a);
};
Child::Child(int a)
{
x = a;
}
int main(int n , char *argv[])
{
}
为什么我会得到这个错误?我怎么解决它呢?提前感谢
发布于 2014-05-14 14:49:03
父类具有显式构造函数,因此编译器不会向其添加隐式“empty”构造函数。另外,您的构造函数有一个参数,因此编译器不能生成对它的隐式调用。这就是为什么你必须明确地这样做的原因。
这样:
child::child(int a) : parent(a)
{
}
发布于 2014-05-14 14:50:53
初始化派生类的对象时,必须首先构造基类部分。如果你没有在派生类的构造函数中通过调用它的构造函数来初始化它,编译器将尝试使用基类的默认构造函数。在您的示例中,没有定义默认构造函数,因为您已经提供了一个自定义构造函数。
为了解决这个问题,你要么为基类提供一个默认的构造函数,要么简单地在派生类的构造函数的初始化器列表中调用它的构造函数:
child::child(int a) : parent(a)
{
}
发布于 2014-05-14 14:52:00
冒着重复错误消息的风险:子类构造函数必须调用其父类的构造函数。
编译器将自动调用父级的默认(无参数)构造函数。如果父级没有默认构造函数,则必须自己显式调用其中一个具有的构造函数。
编译器必须强制执行此操作,以确保正确设置子类从父类继承的功能……例如,初始化子级从父级继承但不能直接访问的任何私有变量。即使你的类没有这个问题,你仍然必须遵守规则。
以下是使用继承的类中的构造函数的一些示例:
这很好,ParentA有一个默认的构造函数:
class ParentA
{
};
class ChildA
{
public:
ChildA() {}
};
这并不好;ParentB没有默认构造函数,因此ChildB1类必须显式调用其中一个构造函数本身:
class ParentB
{
int m_a;
public:
ParentB(int a) : m_a(a) {}
};
class ChildB1 : public ParentB
{
float m_b;
public:
// You'll get an error like this here:
// "error: no matching function for call to ‘ParentB::ParentB()’"
ChildB1 (float b) : m_b(b) {}
};
这很好,我们显式调用ParentB的构造函数:
class ChildB2 : public ParentB
{
float m_b;
public:
ChildB2(int a, float b) : ParentB(a), m_b(b) {}
};
这很好,ParentC有一个默认的构造函数,它将被自动调用:
class ParentC
{
int m_a;
public:
ParentC() : m_a(0) {}
ParentC(int a) : m_a(a) {}
};
class ChildC: public ParentC
{
float m_b;
public:
ChildC(float b) : m_b(b) {}
};
https://stackoverflow.com/questions/23647409
复制相似问题