假设我有一个“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/