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

Posted

技术标签:

【中文标题】在派生类的构造函数中初始化没有默认构造函数的基类【英文标题】: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

【问题讨论】:

Class inherited from class without default constructor的可能重复 【参考方案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

以上是关于在派生类的构造函数中初始化没有默认构造函数的基类的主要内容,如果未能解决你的问题,请参考以下文章

多继承 与 多重继承

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

2017.8.23

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数