C ++函数继承,传入参数

时间:2018-06-29 02:52:51

标签: c++ c++11 inheritance

基类:Employee
派生类:Regular

Employee.cpp

void Employee::setValue(string id, string name, double s, int n)
{
    empID = id;
    empName = name;
    salary = s;
}

Regular.cpp

void Regular::setValue(string id, string name, double s, int n) 
{
    annualLeave = n;
}

Employee::setValue()仅存储传入的前3个参数,也不存储int n

我应该继承setValue()中的Regular::setValue(),然后传入参数,但是这次将int n存储到annualLeave

我该怎么做?

或者,我是否可以在子类的基类中设置int n

2 个答案:

答案 0 :(得分:2)

您可以调用基类的实现:

void Regular::setValue(string id, string name, double s, int n) {
    annualLeave = n;
    return Employee::setValue(std::move(id), std::move(name), s);
}

否则,使基类具有多态性:

struct Employee {
    void setValue(string id, string name, double s, int n) {
        empID = std::move(id);
        empName = std::move(name);
        salary = s;
        setLeave(n);
    }
    virtual ~Employee() {}
protected:
    virtual void setLeave(int) = 0;
    string empID;
    string empName;
    double salary;
};

struct Regular: Employee {
private:
    void setLeave(int n) override { annualLeave = n; }
    int annualLeave;
};

答案 1 :(得分:0)

如果需要保留单个签名setValue函数,则可以这样做:

-

包括:

#include <any>
#include <map>
#include <string>

-

Employee.h:

class CEmployee
{
protected:
    virtual void setValue(std::map<std::string, std::any> &info);

    int m_empID = 0;
    std::string m_empName = {'\0'};
    int m_salary = 0;
}

Employee.cpp:

void CEmployee::setValue(std::map<std::string, std::any> &info)
{
    std::any item;

    item = info["empID"];
    if (item.has_value())
        m_empID = std::any_cast<int>(item); // int

    item = info["empName"];
    if (item.has_value())
        m_empName = std::any_cast<std::string>(item); // std::string 

    item = info["salary"];
    if (item.has_value())
        m_salary = std::any_cast<int>(item); // int 
}

-

Regular.h:

class CRegular : public CEmployee
{
public:
    void setValue(std::map<std::string, std::any> &info) override;

protected:
    std::string m_annualLeave = {'\0'};
}

Regular.cpp:

void CRegular::setValue(std::map<std::string, std::any> &info)
{
    std::any item;

    CEmployee::setValue(info);

    item = info["annualLeave"];
    if (item.has_value())
        m_annualLeave = std::any_cast<std::string>(item); // std::string 
}

-

&这样称呼它:

void MyClass::HardcodedExample()
{
    CRegular regular_employee;
    std::map<std::string, std::any> info, update;

    info["empID"] = { 100 };
    info["empName"] = { std::string("Trump") };
    info["salary"] = { 1000000 };
    info["annualLeave"] = { std::string("29 Jul 2018") };
    regular_employee.setValue(info); // Set all info

    // Or:
    update["annualLeave"] = { std::string("29 Dec 2018") };
    regular_employee.setValue(update); // Update just "annualLeave"

    // Or:
    update["salary"] = { 1200000 };
    update["annualLeave"] = { std::string("04 Jul 2018") };
    regular_employee.setValue(update); // Update "salary" & "annualLeave"
}

-

否则,将setValue的3个参数设置为基类,将4个参数设置为派生类(调用具有3个参数的基类并自行设置第4个参数)-类似于@RemyLebeauis提供的功能-是更好的解决方案。

-

&最好使用#define /枚举键代替字符串键(并相应地更改映射的键类型),但这是另一个问题。