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

时间:2016-01-02 15:05:21

标签: c++ class inheritance

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

  

没有匹配的功能来调用

错误。有人能帮助我吗?

我的代码:
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
}

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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
    

    或添加default-constructor重载:

    primary() = default;
    

答案 2 :(得分:0)

TimerTask

也应该取一个整数:

public:
    secondary();

然后ctor定义:

public:
    secondary(int x);