错误:基类构造函数必须显式初始化父类构造函数

时间:2014-05-14 06:43:22

标签: c++ constructor initialization derived-class

我是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[]) 
{

}

为什么我收到此错误?  我该如何解决? 提前致谢

5 个答案:

答案 0 :(得分:32)

父类有一个显式的构造函数,因此编译器不会添加一个隐式的&#39;空的&#39;它的构造函数。此外,您的构造函数有一个参数,因此编译器无法生成对它的隐式调用。这就是为什么你必须明确地做到这一点。

这样:

 child::child(int a) : parent(a)
 {
 }

答案 1 :(得分:14)

初始化派生类的对象时,必须首先构造基类部分。如果您没有在派生类中自己初始化它,那么#39;构造函数通过调用其构造函数之一,编译器将尝试使用基类的默认构造函数。在您的情况下,未定义默认构造函数,因为您已经提供了自定义构造函数。

要解决此问题,您必须为基类提供默认构造函数,或者只是在派生类中调用其构造函数。构造函数的初始化列表:

child::child(int a) : parent(a)
 {
 }

答案 2 :(得分:3)

冒着重复错误消息的风险:子类构造函数必须调用其父构造函数。

编译器将添加父默认(无参数)构造函数的自动调用。如果父级没有默认构造函数,则必须自己显式调用它具有的构造函数之一。

编译器必须强制执行此操作以确保子类从父级继承的功能已正确设置...例如,初始化子级从父级继承的任何私有变量,但不能直接访问。即使你的班级没有这个问题,你仍然必须遵守规则。

以下是使用继承的类中构造函数的一些示例:

这很好,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) {}
};

答案 3 :(得分:2)

MyBook类派生自基类Book的另一个例子。现在为基类构造函数提供了带有两个参数的自定义构造函数,因此基类没有默认构造函数。在main函数内部,创建派生类对象小说,首先编译器将尝试调用不存在的基类构造函数。因此,需要从派生类构造函数显式调用基类构造函数,以初始化派生类从基类继承但不能直接访问的任何私有变量(例如标题字符串变量)。正如用户rook所提到的,我们需要遵循这些规则。您可以通过Initialization ListsAlex Allain的精彩解释获取更详细的信息。因此,当没有已定义的dafault构造函数以及初始化常量成员时,必须要求初始化列表。他总结了一下 -

  

在运行构造函数体之前,所有的构造函数都是   它的父类,然后调用其字段。默认情况下   调用无参数构造函数。初始化列表允许您   选择调用哪个构造函数以及调用哪些构造函数   构造函数接收。

if words[-1] in 'aeiou':
    print(words[:-1]+'way')
else:
    print(words[:-1]+'ay')

答案 4 :(得分:-4)

您好,只需尝试在您的父类中添加默认构造函数(无参数构造函数)然后编译它。希望这可以解决您的问题。

相关问题