类继承出错

class inheritance erroring out?

本文关键字:出错 继承      更新时间:2023-10-16

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

(在第一次构建时)

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;
}
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的构造函数中的convert构造函数:

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

基类构造函数在创建派生类对象时被调用
在您的示例中,您一定创建了一个aa类的对象,因为bb类是它的基类,所以编译器会搜索bb类的默认构造函数。由于您已经创建了一个参数化构造函数,它不会提供任何导致错误的默认构造函数
对bb()的函数调用没有匹配项
要克服这个错误,请在bb类中提供一个默认构造函数,如

    bb::bb()
    {
    } 



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

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


我在这里所做的是,在初始化派生类的数据成员之前,我刚刚初始化了基类的数据成员,编译器也希望如此。