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

C++ 我可以通过使用参数构造基对象从派生类创建对象吗?,c++,constructor,polymorphism,copy-constructor,C++,Constructor,Polymorphism,Copy Constructor,换句话说,给定基类形状和派生类矩形: class shape { public: enum shapeType {LINE, RECTANGLE}; shape(shapeType type); shape(const shape &shp); } class rectangle : public shape { public: rectangle(); rectangle(const rectangle &rec); } 我想知道是否可以通过调用以下命令

换句话说,给定基类
形状
和派生类
矩形

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);
shape *pNewRectangle = new shape(pRectangle);
我如何实现复制构造函数,以便通过调用获得新的
矩形

shape *pRectangle = new shape(RECTANGLE);
shape *pNewRectangle = new shape(pRectangle);
简短回答:没有

长答覆:

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

class Shape
{
    static Shape* createShape(shapeType type)
    {
        switch (type)
        {
             case RECTANGLE:return new rectangle();
           ...
        }
    }
 }; 
个人喜好: 我将使用一个完全不同的类作为工厂,而不是在基类上使用静态方法。原因是每次创建新的形状类时,上述样式都会强制您每次重新构建形状类

因此,我将工厂划分为一个ShapeFactory类。

简短回答:否

长答覆:

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

class Shape
{
    static Shape* createShape(shapeType type)
    {
        switch (type)
        {
             case RECTANGLE:return new rectangle();
           ...
        }
    }
 }; 
个人喜好: 我将使用一个完全不同的类作为工厂,而不是在基类上使用静态方法。原因是每次创建新的形状类时,上述样式都会强制您每次重新构建形状类


因此,我将工厂划分为一个ShapeFactory类。

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

new shape(...)

我认为您应该改用factory设计模式,在这种模式中,shape上有一个静态方法,可以根据需要创建任何子类型。

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

new shape(...)
shape *pRectangle = new shape(RECTANGLE);
我认为您应该改用factory设计模式,其中有一个关于shape的静态方法,可以根据需要创建任何子类型

shape *pRectangle = new shape(RECTANGLE);
您无法通过构造基对象来创建派生类。您必须对派生类本身执行新的操作


您无法通过构造基对象来创建派生类。您必须对派生类本身执行新的操作。

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


问题是,当您创建新的shape(…)时,总是会返回shape的实例,而不是rectangle。如果你想要一个“矩形”,在某一点上,它需要调用new rectangle(..)。一种方法可以为您处理此逻辑,但不能处理C++中的默认结构。

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


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

可以使用动态浇铸来实现这一点,但是ERM,不,不是从构造函数内完成的。如上文所述,在工厂方法中使用它


在C++中可以使用动态浇铸来实现这一点,但是ERM,不,不是从构造函数内完成的。如上文所述,在工厂方法中使用它


请参见,例如,您可以通过基于策略的设计实现类似的功能。你的代码应该是

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

通过基于策略的设计,您可以实现类似的功能。你的代码应该是

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

为什么要上课?我只需要做一个工厂函数,就这样。根据这个问题--我想我还必须使用克隆方法而不是复制构造函数。在最简单的情况下,工厂函数是可以的。但是当事情变得更加复杂,需要将工厂调用拆分为几个函数调用时,可访问性约束比使用多个静态函数更容易处理。但在这种情况下,这只是风格的问题。当事情变得更复杂时,如果你有一个类,你可以开始使用抽象工厂,从而根据运行时配置返回不同类型的对象。因此,我可以拥有一个基于简单抽象基工厂的WindowsShape工厂和MacShapeFactory。同样,你可以用函数来实现这一点,但它从来没有这么整洁过。这让我毛骨悚然。为什么要上课?我只需要做一个工厂函数,就这样。根据这个问题--我想我还必须使用克隆方法而不是复制构造函数。在最简单的情况下,工厂函数是可以的。但是当事情变得更加复杂,需要将工厂调用拆分为几个函数调用时,可访问性约束比使用多个静态函数更容易处理。但在这种情况下,这只是风格的问题。当事情变得更复杂时,如果你有一个类,你可以开始使用抽象工厂,从而根据运行时配置返回不同类型的对象。因此,我可以拥有一个基于简单抽象基工厂的WindowsShape工厂和MacShapeFactory。同样,你可以用函数来实现这一点,但它从来没有这么整洁过。这只会让我发抖。