Можно ли передать объект дочернего класса в карту с определением базового класса? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь создать обширную базу данных для компании.Я сделал разные уроки для каждого уровня работника.Но я не понимаю, как я помещаю объекты разных типов в одну карту.

Насколько я попробовал, он просто выдвигается, не показывает ошибку компиляции, как сейчас.

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 голосов
/ 24 июня 2019

Вы можете использовать указатели или ссылки.

Вот пример с указателями и 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));
    }
0 голосов
/ 24 июня 2019

Вы должны хранить указатели, и они лучше должны быть умными.Например:

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)});
0 голосов
/ 24 июня 2019

Виртуальный полиморфизм активируется, когда у вас есть ссылка / указатель на базовый объект.

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

employeeMap.insert({employeeName, engineerClassObject});

, а затем

employeeMap["some_emp_name"]->some_virtual_function();
...