在派生类的构造函数中初始化没有默认构造函数的基类
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
。以上是关于在派生类的构造函数中初始化没有默认构造函数的基类的主要内容,如果未能解决你的问题,请参考以下文章
C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量