【问题标题】:C++ polymorphism: Checking data type of sub class [duplicate]C ++多态性:检查子类的数据类型[重复]
【发布时间】:2011-05-05 15:54:07
【问题描述】:

可能重复:
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 类对象的指针?

【问题讨论】:

  • 另一方面,您应该考虑不这样做。如果您认为需要这样做,那么您的设计可能有问题。
  • 多态性不是这样工作的。多态性意味着无需检查。
  • 有正当的理由想知道多态类的具体类型;也就是说,它们很少而且相差甚远。知道如何检查具体类型是很好的;很高兴知道必须这样做通常是一个不好的迹象。
  • @Armen:我不完全同意个人的一点,只要你公开代码就不再是个人的了。总有一天会有人从这个烂摊子中继承下来。
  • @Armen:我明白,而且我承认一个字母的前缀并不多,但接下来我们会得到class ClassPolygon;void FunctionAdd(int,int) 等......另外,做您在 struct 前加上 CS ?如果有人改变了种类而不是前缀怎么办?这可能会让人感觉很私人,但冗余会导致不一致。

标签: c++ object polymorphism


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    理想情况下,您不需要。您使用多态性只是为了做正确的事:

    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(),否则您将无法实例化它。

    【讨论】:

    • 这不是 OP 所要求的,虽然说“不要那样做”很容易,但想要获得类的具体类型是有正当理由的。
    • @McWafflestix:但是如果我有另一个包含一些额外函数的子类并且我想调用这些函数呢?
    • @AmitS:这就是我的观点;你可能想做这样的事情。
    • @McWafflestix:真的很抱歉,我想问“Fred Larson”这些问题。我混淆了名字。对困惑感到抱歉。 @Fred Larson:您愿意回答我在之前评论中提到的场景的有效性吗?
    • 一般来说,必须检查多态对象的具体类型是糟糕设计的标志。基本上你应该避免它,除非真的有必要。
    【解决方案3】:

    你可以动态转换它:

    CRect* pRect = dynamic_cast<CRect*>(MyPolygonPointer);
    
    if(pRect != 0)
    {
       //...it is a CRect
    }
    

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

    【讨论】:

      【解决方案4】:

      您可以对 CRectangle 执行 dynamic_cast 并查看是否给出了正确的结果。

      【讨论】:

        猜你喜欢
        • 2015-01-25
        • 2014-09-11
        • 2013-09-14
        • 1970-01-01
        • 2011-01-10
        • 2020-12-21
        • 2013-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多