Могу ли я создать объект из производного класса, создав базовый объект с параметром? - PullRequest
0 голосов
/ 09 июля 2009

Другими словами, с учетом базового класса shape и производного класса rectangle:

class shape
{
public:
  enum shapeType {LINE, RECTANGLE};
  shape(shapeType type);
  shape(const shape &shp);
}

class rectangle : public shape
{
public:
  rectangle();
  rectangle(const rectangle &rec);
}

Я хотел бы знать, могу ли я создать экземпляр rectangle, вызвав:

shape *pRectangle = new shape(RECTANGLE);

и как я могу реализовать конструктор копирования, чтобы получить новый rectangle, вызвав:

shape *pNewRectangle = new shape(pRectangle);

Ответы [ 6 ]

4 голосов
/ 09 июля 2009

Краткий ответ: Нет

Длинный ответ:

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

class Shape
{
    static Shape* createShape(shapeType type)
    {
        switch (type)
        {
             case RECTANGLE:return new rectangle();
           ...
        }
    }
 }; 

Личные предпочтения:

Я бы пошел с совершенно другим классом, чтобы быть фабрикой, а не использовать статический метод в базовом классе. Причина этого в том, что каждый раз, когда вы создаете новый класс Shape, вышеуказанный стиль заставляет вас каждый раз перестраивать класс Shape.

Так что я бы выделил фабрику в класс ShapeFactory.

1 голос
/ 09 июля 2009

Вы не можете сделать это напрямую из конструктора. Вместо этого вам нужно использовать другой подход, такой как Фабричный метод .

Проблема в том, что когда вы создаете новую форму (...), вы всегда будете возвращать экземпляр формы, а не прямоугольник. Если вам нужен «прямоугольник», в какой-то момент ему нужно будет вызвать новый прямоугольник (..). Метод может обработать эту логику для вас, но не конструкцию по умолчанию в C ++.

0 голосов
/ 09 июля 2009

Вы можете сделать что-то подобное с дизайном на основе политик. Ваш код будет что-то вроде

shape* pRectangle = new derrivedType<rectangle>();

Дизайн на основе политики

0 голосов
/ 09 июля 2009

В C ++ вы можете использовать динамическое приведение для достижения этой цели, но нет, не из конструктора. Используйте это как подразумевается выше в заводском методе

см., Например, http://www.cprogramming.com/reference/typecasting/dynamiccast.html

0 голосов
/ 09 июля 2009
shape *pRectangle = new shape(RECTANGLE);

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

0 голосов
/ 09 июля 2009

Вызов конструктора всегда даст вам объект типа конструктора.

new shape(...)

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

...