基于变量的C++向下转换为派生类

rke*_*r78 5 c++ inheritance casting

假设我有一个基类"Shape",派生类"Triangle","Square"和"Circle"."Shape"的成员是int"shapeType".

如果shapeType == 1,则它是一个三角形.如果shapeType == 2,那么它就是一个正方形.如果shapeType == 3,那么它就是一个圆圈.

我有兴趣知道,如果有一种"Shape"对象曾经是派生对象,如果有一种方法可以通过使用shapeType值"动态"向下转换为正确的派生类.

我知道我可以做一个硬代码切换语句,大致如下:

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

switch (shape->shapeType) {
case 1:
   t = (Triangle*)shape;
case 2: 
   ...
}
Run Code Online (Sandbox Code Playgroud)

但是,上面要求我制作一个每个派生类可能性的指针.我想知道是否有一种方法可以在不对每个类进行硬编码的情况下执行此操作,而是以某种方式确定类型类型映射,其中键是shapeType,值是类类型.

Naw*_*waz 10

如果他们有虚函数,那么使用dynamic_cast:

t = dynamic_cast<Triangle*>(shape);
if ( t )
{
     //use t
}
Run Code Online (Sandbox Code Playgroud)

但请注意:您应该尝试以几乎不需要使用的方式定义类和虚函数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()
Run Code Online (Sandbox Code Playgroud)

无需使用shapeType变量.