2009-11-14 3 views
-1

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

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

По существу,

Command * copiedCommand = new Command(commandImplementation); 

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

+0

Можете ли вы показать больше кода? Я не вижу, как черепица вашего вопроса связана с телом. ;-) – Achim

+0

STL-карта строки в командных указателях, вы имеете в виду? –

+3

На самом деле ... Я имею в виду один! Даже если вам не нравится C++, говоря, что это не настоящий язык ** ... – JRL

ответ

4

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

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

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

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

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

Command * copiedCommand = commandImplementation->Clone(); 
+0

Держу пари, делает это более элегантным. –

+0

YEs это будет хорошим ответом для Java. –

0

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

class Command { 
    public: 
     virtual Command* clone(void) const = 0; 
}; 
1

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

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

  • ИЗБЕЖАТЬ подклассы в объекте создателя в приложении клиента , как абстрактный завод модель делает.
  • избежать присущей стоимости создания нового объекта стандартного способа (например, с использованием «новым» ключевого слова), когда это чрезмерно дорого для данного применения.

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

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

Смежные вопросы