将变量传递给具有多重继承的构造函数

问题描述 投票:0回答:1

我在通过我的类传递两条数据时遇到问题,特别是 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;
    }
};

错误

错误(活动)E0289 没有构造函数的实例

CFulltimeEmployee::CFulltimeEmployee
与参数列表匹配

错误 C2664

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

c++ inheritance constructor
1个回答
0
投票

编写一个最小的可重现示例实际上并不难;您删除不需要的所有内容,同时仍然演示问题。在这种情况下,可能是:

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_benefitcost
m_rate
m_hours
;也不是
PrintCheck()
。 (
class
默认为
private
,而
struct
public
;这也有助于减少噪音。)

一旦完成此操作,就很容易看到编译器抱怨的问题

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

CHourlyFTEmployee
中,您写了
const
char name[]
(和
const char id[]
);但基类 (
CFulltimeEmployee
) 是
char name[]
——不是
const
const
的数据不能“轻易”分配给非
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())) { }
};
© www.soinside.com 2019 - 2024. All rights reserved.