【问题标题】:Passing variables to a constructor with multiple inheritance将变量传递给具有多重继承的构造函数
【发布时间】:2021-07-02 19:14:44
【问题描述】:

我在通过我的类传递两条数据时遇到问题,特别是 ID 和 Name。我知道如果不通过以前的父类就无法调用基类构造函数,但我正在努力弄清楚为什么这不起作用,我是否需要一直使用构造函数,或者我可以在末尾添加它我的类创建喜欢基类吗?

提前致谢。

class CEmployee
{
private:
char m_name[30];
char m_id[30];
//virtual float Pay() { return 0;};  // virtual function
virtual float Pay() = 0; // pure virtual function
public:

CEmployee(char name[], char id[])
{
    strcpy_s(m_name, name);
    strcpy_s(m_id, id);
}

CEmployee()
{
    strcpy_s(m_name, "");
    strcpy_s(m_id, "");
}
void PrintCheck()
{
    cout << m_name << "  " << Pay() << endl;
}
};

class CFulltimeEmployee : public CEmployee
{
protected:
static float m_benefitcost;
public:
CFulltimeEmployee()
{

}
CFulltimeEmployee(char name[], char id[]) : CEmployee (name, id)
{
    m_benefitcost = 100;
}

};

float CFulltimeEmployee::m_benefitcost = 100;

class CHourlyFTEmployee : public CFulltimeEmployee
{
private:
float m_rate;
float m_hours;
public:
CHourlyFTEmployee()
{
}

CHourlyFTEmployee(const char name[], const char id[], float rate, float hours) : CFulltimeEmployee 
(name, id)
{
    m_rate = rate;
    m_hours = hours;
}
float Pay()
{
    return m_rate * m_hours - m_benefitcost;
}
};

错误

Error (active) E0289 no instance of constructor "CFulltimeEmployee::CFulltimeEmployee" 与参数列表匹配

错误 C2664 'CFulltimeEmployee::CFulltimeEmployee(char [],char [])': 无法将参数 1 从 'const char []' 转换为 'char []' Project9

【问题讨论】:

  • 您展示的代码有哪些问题?如果您遇到构建错误,请将完整且完整的错误输出复制粘贴到问题中。
  • 在 C++ 中,你真的,真的应该使用 std::string 并尽一切努力避免 char*尤其是在你有这些绝对微小的缓冲区大小为 29 的情况下。
  • 只是关于术语的一点:这不是多重继承。多重继承是指具有多个直接基的类。 struct a {}; struct b {}; struct c : a, b {};.
  • 不要使用破坏性的编辑来删除问题的文本;它对未来的读者没有帮助。如果您不想保留问题,请将其标记为删除。回滚您的编辑。

标签: c++ inheritance constructor


【解决方案1】:

写一个minimal reproducible example 真的没那么难;你删除了所有不需要的东西,同时仍然展示了问题。在这种情况下,它可能是:

class CEmployee
{
    char m_name[30];
    char m_id[30];
    virtual float Pay() = 0; // pure virtual function
public:
    CEmployee(char name[], char id[])
    {
        strcpy_s(m_name, name);
        strcpy_s(m_id, id);
    }
};

struct CFulltimeEmployee : public CEmployee
{
    CFulltimeEmployee(char name[], char id[]) : CEmployee(name, id) { }
};

struct CHourlyFTEmployee : public CFulltimeEmployee
{
    CHourlyFTEmployee(const char name[], const char id[]) : CFulltimeEmployee(name, id) { }
    float Pay() override { return 0.0; }
};

特别注意,m_benefitcostm_ratem_hours 都不需要; PrintCheck() 也不是。 (class 默认为privatestructpublic;这也有助于降低噪音。)

一旦你这样做了,就很容易看到编译器抱怨的问题

错误 C2664: 'CFulltimeEmployee::CFulltimeEmployee(char [],char [])': 无法将参数 1 从 'const char []' 转换为 'char []'

CHourlyFTEmployee,你写了const char name[](和const char id[]);但是基类(CFulltimeEmployee)是char name[]——不是constconst 的数据不能“轻松”分配给非const 数据; “修复”很简单:删除 const:

CHourlyFTEmployee(char name[], char id[]) : CFulltimeEmployee(name, id) { }`

该示例仍有其他问题,但听起来您被现有的CEmployee 基类所困。


更好的解决方案是尽可能多地隐藏旧的CEmployee 类;也许通过引入另一个类CEmployeeNew (或CEmployee2);可能看起来像:

struct CEmployeeNew : public CEmployee
{
    CEmployeeNew(const std::string& name, const std::string& id) :
        CEmployee(const_cast<char*>(name.c_str()), const_cast<char*>(id.c_str())) { }
};

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2020-01-16
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多