【问题标题】:Initialize base class with no default constructor in constructor of derived class在派生类的构造函数中初始化没有默认构造函数的基类
【发布时间】:2016-01-02 15:05:20
【问题描述】:

我正在尝试创建一个子类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

primary.cpp:

#include "primary.h"

primary::primary(int x)
{
    primary_x = x;
}

primary::~primary()
{
    //dtor
}

secondary.h:

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


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

#endif // SECONDARY_H

secondary.cpp:

#include "secondary.h"

secondary::secondary()
{
    //ctor
}

secondary::~secondary()
{
    //dtor
}

【问题讨论】:

标签: c++ class inheritance


【解决方案1】:

因为您没有默认构造函数,编译器会抱怨它无法为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;
};

【讨论】:

    【解决方案2】:

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

    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;
      

    【讨论】:

      【解决方案3】:
      public:
          secondary();
      

      也应该取一个整数:

      public:
          secondary(int x);
      

      然后是ctor定义:

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

      【讨论】:

      • 这不会编译。
      • 错误是什么?啊,好的,我明白了;)secondary::secondary() 应该像声明中那样采用 int。
      • 你突然冒出x
      猜你喜欢
      • 2023-03-31
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2018-07-16
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多