Как создать копию производного объекта, когда объект передается как базовый тип? C ++ - PullRequest
0 голосов
/ 12 января 2019

У меня сейчас такой дизайн: (Обратите внимание, IWorker - абстрактный класс)

UML diagram

Как вы можете видеть, функция "addWorker" является чисто виртуальной и реализована в менеджере нижнего класса.

Моя проблема здесь:

void Manager::addWorker(IWorker* worker) {
    this->_workers.push_back(worker);
    worker->setBoss(this);
}

1) Компилятор не может создать объект IWorker для вектора _workers. Что такое правильный способ решить эту проблему? Я думал пойти с прототипом спроектировать и заставить все объекты IWorker реализовать метод copy () и использовать это там.

2) Хорошо ли для IWorker держать _boss как объект IWorker или мне следует попробовать указатели подходят как IWorker *?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Это один шаблон для копирования производных объектов из указателей базового класса, он просто использует конструктор копирования в каждом производном классе и виртуальную функцию clone.

class Base
{
public:
    virtual Base* clone() const = 0;
};

class Derived
{
public:
    virtual Derived* clone() const { return new Derived(*this); }
};

Аналогичный код возможен и для умных указателей.

0 голосов
/ 12 января 2019

заставляет все объекты IWorker реализовать метод copy () и использовать его там.

нет, это не решает проблему

Я пытаюсь использовать указатели как IWorker *

да, vector<IWorker> должно быть vector<IWorker *>

Обратите внимание, что в Manager::addWorker вы уже предполагаете, что у вас есть вектор указателя

P.S.

Из вашей проблемы, почему вы не используете реализацию и обобщение для указания наследования?

Функция «addWorker» является чисто виртуальной и реализована в менеджере нижнего класса

Если это так, то Manager является работником , вы действительно * уверены в этом? Обычно Manager является независимым классом, который не наследует класс, которым он управляет, и может быть singleton

Вы уверены, что понимаете, что такое наследство?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...