0

换句话说,给定一个基类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);
4

6 回答 6

4

简短的回答:没有

长答案:

您需要一个工厂对象/方法。
您可以将静态工厂方法添加到基类以创建适当的对象类型。

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

个人喜好:

我会使用一个完全不同的类作为工厂,而不是在基类上使用静态方法。这样做的原因是每次创建新的 Shape 类时,上述样式都会迫使您每次都重新构建 Shape 类。

所以我会将工厂分离成一个 ShapeFactory 类。

于 2009-07-09T16:40:13.323 回答
1

您不能直接从构造函数中执行此操作。相反,您需要使用另一种方法,例如工厂方法

问题是,当你执行 new shape(...) 时,你总是会返回一个 shape 实例——而不是矩形。如果你想要一个“矩形”,在某些时候,它需要调用 new rectangle(..)。一个方法可以为您处理这个逻辑,但不是 C++ 中的默认构造。

于 2009-07-09T16:41:45.147 回答
0

调用构造函数将始终为您提供构造函数类型的对象。

new shape(...)

我认为您想改用工厂设计模式,其中有一个形状上的静态方法可以根据需要创建任何子类型。

于 2009-07-09T16:40:51.497 回答
0
shape *pRectangle = new shape(RECTANGLE);

您无法通过构造基对象来创建派生类。你必须对派生类本身做一个新的。

于 2009-07-09T16:41:36.707 回答
0

在 C++ 中,您可以使用动态转换来完成此操作,但呃,不,不是在构造函数中。在工厂方法中按照上面暗示的方式使用它

参见例如http://www.cprogramming.com/reference/typecasting/dynamiccast.html

于 2009-07-09T16:45:10.723 回答
0

您可以使用基于策略的设计来做类似的事情。您的代码将类似于

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

基于策略的设计

于 2009-07-09T17:41:26.087 回答