首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >错误:基类构造函数必须显式初始化父类构造函数

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

Stack Overflow用户
提问于 2014-05-14 14:43:22
回答 4查看 43.3K关注 0票数 41

我是c++的新手。当我尝试编译下面的代码时,我得到了这个错误

constructor for 'child' must explicitly initialize the base class 'parent' which does not have a default constructor child::child(int a) {

这是我的班级

代码语言:javascript
复制
#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[]) 
{

}

为什么我会得到这个错误?我怎么解决它呢?提前感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-14 14:49:03

父类具有显式构造函数,因此编译器不会向其添加隐式“empty”构造函数。另外,您的构造函数有一个参数,因此编译器不能生成对它的隐式调用。这就是为什么你必须明确地这样做的原因。

这样:

代码语言:javascript
复制
 child::child(int a) : parent(a)
 {
 }
票数 50
EN

Stack Overflow用户

发布于 2014-05-14 14:50:53

初始化派生类的对象时,必须首先构造基类部分。如果你没有在派生类的构造函数中通过调用它的构造函数来初始化它,编译器将尝试使用基类的默认构造函数。在您的示例中,没有定义默认构造函数,因为您已经提供了一个自定义构造函数。

为了解决这个问题,你要么为基类提供一个默认的构造函数,要么简单地在派生类的构造函数的初始化器列表中调用它的构造函数:

代码语言:javascript
复制
child::child(int a) : parent(a)
 {
 }
票数 18
EN

Stack Overflow用户

发布于 2014-05-14 14:52:00

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

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

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

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

这很好,ParentA有一个默认的构造函数:

代码语言:javascript
复制
class ParentA
{
};

class ChildA
{
public:
    ChildA() {}
};

这并不好;ParentB没有默认构造函数,因此ChildB1类必须显式调用其中一个构造函数本身:

代码语言:javascript
复制
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的构造函数:

代码语言:javascript
复制
class ChildB2 : public ParentB
{
    float m_b;

public:
    ChildB2(int a, float b) : ParentB(a), m_b(b) {}
};

这很好,ParentC有一个默认的构造函数,它将被自动调用:

代码语言:javascript
复制
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) {}
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23647409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档