是否可以在具有基类定义的映射中传递子类对象?

时间:2019-06-24 09:56:05

标签: c++ unordered-map

我正在尝试为公司创建一个广泛的数据库。我为每个级别的员工开设了不同的课程。但是我不明白如何在单个地图中推送不同类型的对象。

据我尝试,它只是被推入,至少到目前为止没有任何编译错误。

class EmployeeClass
{}

class CEOClass: public EmployeeClass
{}

class ManagerClass:public EmployeeClass
{}

class EngineerClass: public EmployeeClass
{}

int main()
{
    EngineerClass engineerClassObject;
    std::map<std::string employeeName, EmployeeClass> employeeMap;

    employeeMap.insert({employeeName, enginerrClassObject});
}

我想知道我是否可以这样做。如果不是,什么是不添加额外地图的最佳方法。如果是,怎么可能,它如何运作?

3 个答案:

答案 0 :(得分:0)

当您具有对基础对象的引用/指针时,虚拟多态性就会启动。

$ git push http://example.com/repo.git

然后

EmployeeClass *engineerClassObject = new EngineerClass();
std::map<std::string, EmployeeClass*> employeeMap;

employeeMap.insert({employeeName, engineerClassObject});

答案 1 :(得分:0)

您可以使用指针或引用。

这里有一个带有指针和std::pair的示例。

int main()
{
    EngineerClass engineerClassObject;
    std:string employeeName = "Peter";
    std::map<std::string employeeName, EmployeeClass*> employeeMap;

    employeeMap.insert(std::pair<std::string,EmployeeClass*>(employeeName, &enginerrClassObject));
}

编辑:

示例参考:

  int main()
    {
        EngineerClass engineerClassObject;
        std:string employeeName = "Peter";
        std::map<std::string employeeName, EmployeeClass&> employeeMap;

        employeeMap.insert(std::pair<std::string,EmployeeClass&>(employeeName, enginerrClassObject));
    }

答案 2 :(得分:0)

您应该存储指针,它们最好是聪明的。例如:

std::map<std::string, std::unique_ptr<EmployeeClass>> employeeMap;
employeeMap.insert({"Engineer", std::make_unique<EngineerClass>()});

std::map<std::string, std::unique_ptr<EmployeeClass>> employeeMap;
auto engineer = std::make_unique<EngineerClass>()
employeeMap.insert({"Engineer", std::move(engineer)});