,换言之给定的基类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);
有帮助吗?

解决方案

短答案:否

长答案:

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

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

个人偏好:

我将与一个完全不同的类去是工厂,而不是使用一个静态方法上的基类。这样做的原因是,你创建一个新的Shape类,每次上面的样式迫使你每次都重新建立Shape类。

因此,我将在工厂分离器出到ShapeFactory类。

其他提示

您不能从构造方法中这样直接。相反,你需要使用其他方法,如工厂方法

但问题是,当你做新造型(...),你会总是返回形状的实例 - 而不是矩形。如果你想要一个“矩形”,在某些时候,它需要调用新的矩形(..)。一种方法,可以处理这个逻辑你,但不是缺省结构在C ++中。

调用一个构造函数将总是给你的构造方法的类型的对象。

new shape(...)

我想你想使用的工厂设计模式代替,其中存在于形状的静态方法,它可以创建任何亚型,是必要的。

shape *pRectangle = new shape(RECTANGLE);

有没有办法让你通过构建基础对象来创建派生类。你必须做一个新的派生类本身。

在C ++可以使用动态铸造来实现这一点,但ERM,不,不是从构造方法中。使用它作为在工厂方法如上提示

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

您可以做这样的事情与基于策略的设计。您的代码会是这样的

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

基于策略的设计

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top