C ++多态:检查子类的数据类型

时间:2010-11-05 15:03:01

标签: c++ object polymorphism

  

可能重复:
  Finding the type of an object in C++

您好,
我很抱歉,如果它是重复但我无法在这里找到我的问题的答案。
假设我们在c ++中有以下类结构:

class CPolygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }
  };

class CRectangle: public CPolygon {
  public:
    int area ()
      { return (width * height); }
  };

现在我有一个指向CPolygon对象的指针。我如何检查它是否实际上是指向类CRectangle对象的指针?

4 个答案:

答案 0 :(得分:11)

您可以通过检查dynamic_cast<CRectangle*>(ptr)是否返回非空来执行此操作,其中ptr是指向CPolygon的指针。但是,这要求基类(CPolygon)至少具有一个您可能需要的虚拟成员函数(至少是一个虚拟析构函数)。

答案 1 :(得分:5)

理想情况下,你没有。你使用多态来做正确的事:

class CPolygon {
  protected:
    int width, height;
  public:
    void set_values (int a, int b)
      { width=a; height=b; }

    virtual int area() const = 0;
  };

class CRectangle: public CPolygon {
  public:
    int area () const
      { return (width * height); }
  };

在你的CPolygon指针上调用area(),如果它就是这样,你将获得CRectangle的区域。从CPolygon派生的所有内容都必须实现area(),否则您将无法实例化它。

答案 2 :(得分:3)

你动态播放

CRect* pRect = dymanic_cast<CRect*>(MyPolygonPointer);

if(pRect != 0)
{
   //...it is a CRect
}

但自然倾向是一种不好的做法,应谨慎使用。在一个好的设计中,你不关心指针的实际动态类型。

答案 3 :(得分:2)

您可以对CRectangle执行dynamic_cast,看看是否能给出正确的结果。