我可以通过使用参数构造基础对象来从派生类创建对象吗?

时间:2009-07-09 16:37:11

标签: c++ constructor polymorphism copy-constructor

换句话说,给定基类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 个答案:

答案 0 :(得分:4)

简答:否

长答案:

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

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

个人偏好:

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

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

答案 1 :(得分:1)

您无法直接在构造函数中执行此操作。相反,您需要使用其他方法,例如Factory method

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

答案 2 :(得分:0)

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

new shape(...)

我认为你想要使用工厂设计模式,在形状上有静态方法,可以根据需要创建任何子类型。

答案 3 :(得分:0)

shape *pRectangle = new shape(RECTANGLE);

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

答案 4 :(得分:0)

在C ++中,您可以使用动态转换来完成此操作,但是,不,不是来自构造函数。如上所述在工厂方法中使用它

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

答案 5 :(得分:0)

您可以使用基于策略的设计执行类似的操作。你的代码就像是

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

Policy-Based Design