初始化基类,派生类的构造函数中没有默认构造函数

Initialize base class with no default constructor in constructor of derived class

本文关键字:构造函数 默认 基类 派生 初始化      更新时间:2023-10-16

我正在尝试创建一个子类secondary,它可以与参数一起使用,也可以覆盖类primary。现在我得到

没有要调用的匹配函数

错误。有人可以帮助我吗?

我的代码:
主要.h:

#ifndef PRIMARY_H
#define PRIMARY_H

class primary
{
    public:
        primary(int x);
        virtual ~primary();
    protected:
    private:
        int primary_x;
};
#endif // PRIMARY_H

主要.cpp:

#include "primary.h"
primary::primary(int x)
{
    primary_x = x;
}
primary::~primary()
{
    //dtor
}

中学.h:

#ifndef SECONDARY_H
#define SECONDARY_H
#include "primary.h"

class secondary : public primary
{
    public:
        secondary();
        virtual ~secondary();
    protected:
    private:
};
#endif // SECONDARY_H

中学.cpp:

#include "secondary.h"
secondary::secondary()
{
    //ctor
}
secondary::~secondary()
{
    //dtor
}

因为你没有默认的构造函数,编译器抱怨它不能为primary创建一个对象,你应该向secondary构造函数添加一个参数/给它一个默认值:

class secondary : public primary
{
    public:
        secondary(int x);
        virtual ~secondary();
    protected:
    private:
};

然后调用基类构造函数:

secondary::secondary(int x) : primary(x)
{
    //ctor
}

或:

secondary::secondary() : primary(5)
{
    //ctor
}

或者只是为primary添加一个默认构造函数:

class primary
{
    public:
        primary(int x);
        primary() : primary_x(0) {}
        virtual ~primary();
    protected:
    private:
        int primary_x;
};

整个问题看起来像你想做某事,但在编写代码的过程中你忘记了它是什么。

primary的构造函数期望一个int,但它没有得到它,因为

secondary::secondary() { }

相当于:

secondary::secondary() : primary() { }

编译器尝试默认构造primary,但它不是默认构造的。因为您声明了一个采用int构造函数,所以编译器不再生成默认构造函数。

解决 方案:

  • 修改派生类的构造函数:

    secondary::secondary() : primary(10) { } // dummy value
    

    或者模仿基类构造函数的签名:

    secondary::secondary(int x) : primary(x) { }
    
  • 修改基类 - 使primary默认可构造,即将构造函数声明为:

    primary(int x = 10) // dummy default argument
    

    或添加默认构造函数重载:

    primary() = default;
    
public:
    secondary();

还应该取一个整数:

public:
    secondary(int x);

然后是CTOR定义:

secondary::secondary(int x) : primary(x)
{
    //ctor
}