Копирование класса, который наследуется от класса с чисто виртуальными методами - PullRequest
0 голосов
/ 14 ноября 2009

Я давно не использовал C ++, и мне стало слишком комфортно с простотой использования реальных языков.

Во всяком случае, я пытаюсь реализовать шаблон Command, и мне нужно сопоставить несколько реализаций объекта command со строковыми ключами. У меня есть STL-карта строк в Command, и я хотел бы скопировать команду.

По существу,

Command * copiedCommand = new Command( commandImplementation );

И я бы хотел сохранить функциональность командыImplementation. Поскольку Command имеет чисто виртуальную функцию execute, это не работает. Как правильно это сделать?

Ответы [ 3 ]

4 голосов
/ 14 ноября 2009

Один из способов сделать это - добавить это в ваш класс Command:

public:
   virtual Command * Clone() const = 0;

... а затем в различных подклассах Command реализовать Clone (), чтобы вернуть копию объекта:

public:
   virtual Command * Clone() const {return new MyCommandSubclass(*this);}

Как только это будет сделано, вы можете сделать то, что вы хотите, как это:

Command * copiedCommand = commandImplementation->Clone();
1 голос
/ 15 ноября 2009

http://en.wikipedia.org/wiki/Prototype_pattern

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

  • избегать подклассов создатель объекта в клиенте приложение, как абстрактная фабрика шаблон делает.
  • избегать присущих затрат создания нового объекта в стандартным способом (например, используя «новый» ключевое слово), когда это непомерно дорого для данного приложения.

Для реализовать шаблон, объявить абстрактный базовый класс, который определяет чисто виртуальный метод clone (). Любой класс который нуждается в "полиморфном конструкторе" способность вытекает из абстрактный базовый класс и реализует операция clone ().

клиент, вместо написания кода, который вызывает «новый» оператор на жестко имя класса, вызывает метод clone () на прототип, вызывает фабрику метод с обозначением параметра конкретный конкретный производный класс желательный или вызывает метод clone () через какой-то механизм, предоставленный другой шаблон дизайна.

0 голосов
/ 14 ноября 2009

Если Command - абстрактный класс, вы не сможете напрямую вызывать конструктор копирования. Вместо этого вы можете подумать о создании метода clone(), который возвращает глубокую копию объекта. Это также может быть чисто виртуальный метод, который возвращает ваш базовый класс, например:

class Command {
    public:
        virtual Command* clone(void) const = 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...