假设我有一个“Shape”基类,并派生了“Triangle”,“Square”和“Circle”类。
“Shape”的成员是一个int“shapeType”。

如果shapeType == 1,则为三角形。
如果shapeType == 2,则为正方形。
如果shapeType == 3,则为圆。

我很想知道给定我只有一个“Shape”对象,它曾经是一个派生对象,如果有一种方法可以通过使用shapeType值将其“动态”下垂到适当的派生类。

我知道我可以做一个硬编码的switch语句,大致像这样:

Triangle* t;
Square* s;
Circle* c;

switch (shape->shapeType) {
case 1:
   t = (Triangle*)shape;
case 2:
   ...
}

但是,以上要求我为每种派生类的可能性做一个指针。我想知道是否有一种方法可以不对每个类进行硬编码,而是以某种方式确定类类型映射,其中键是shapeType,值是类类型。

最佳答案

如果它们具有虚函数,则使用dynamic_cast:

t = dynamic_cast<Triangle*>(shape);
if ( t )
{
     //use t
}

但请注意:您应该尝试以几乎不需要使用dynamic_cast的方式定义类和虚函数。通常,首选定义明确的界面和多态性。

这是一个例子
class Shape
{
   public:
     virtual ~Shape() {} //destructor must be virtual - important!
     virtual double Area() const = 0;
};

class Triangle : public Shape
{
   public:
     Triangle(double a, double b, double c);
     virtual double Area() const
     {
         //calculate area and return it!
     }
};

Shape *s = new Triangle(10, 20, 30);
double aread = s->Area(); //calls Triangle::Area()

无需使用shapeType变量。

关于c++ - C++根据变量向下转换到派生类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6471623/

10-10 19:49