类继承错误吗?

时间:2013-07-12 17:17:31

标签: c++ qt

尝试构建时遇到两组错误:

(在第一次构建时)

In constructor 'aa::aa(int)':
no matching function for call to 'bb:bb()'
candidates are: bb::bb(int)
bb:bb(const bb&)

(然后我再次点击构建并获得以下内容)

file not recognized: File truncated... takes me to assembly
collect2:ld returned 1 exit status

#ifndef BB_H
#define BB_H

class bb
{
public:
    bb(int _m);
    int m;
};

#endif // BB_H

#ifndef AA_H
#define AA_H
#include "AA/bb.h"

class aa :  bb
{

public:
    aa(int _i);

    int i;
    int j;
};

#endif // AA_H

#include "bb.h"

bb::bb(int _m)
{
    m = _m * 5;
}

#include "aa.h"

aa::aa(int _i)
{
    i = _i;
    j = i + 1;
}

2 个答案:

答案 0 :(得分:3)

In constructor 'aa::aa(int)':
no matching function for call to 'bb:bb()'

编译器的权利。您没有默认构造函数。即使您没有编写默认构造函数,编译器也会为您编写默认构造函数,但如果您有任何用户定义的构造函数,则不会发生这种情况。

您有两个选择:

首先,实现默认构造函数:

class bb
{
public:
    bb(int _m);
    bb();
    int m;
};

bb:bb()
{
}

这可能很严重,因为您将如何初始化m

其次,使用初始化列表调用aa构造函数中的转换构造函数:

aa::aa(int _i)
:
  bb (_i)
{
    i = _i;
    j = i + 1;
}

答案 1 :(得分:0)

在创建派生类对象时调用基类构造函数。
在你的例子中,你必须创建一个类aa的对象,因为类bb是它的基类,编译器会搜索bb类的默认构造函数。由于您已创建参数化构造函数,因此它不会提供导致错误的任何默认构造函数 没有匹配函数调用bb()。
要克服该错误,要么在类bb中提供默认构造函数,如

    bb::bb()
    {
    } 



在aa构造函数初始化列表中,只需调用类bb参数化构造函数,如下所示

    aa::aa(int i):bb(int x)
    {
    }  


我在这里做的是,我刚刚在初始化派生类的数据成员之前初始化了基类的数据成员,并且编译器期望相同。