代码之家  ›  专栏  ›  技术社区  ›  MOnsDaR

继承类的强制排序?

  •  0
  • MOnsDaR  · 技术社区  · 15 年前

    我有三节课:

    class Super
    {
        virtual int getType() { return 1; }
    }
    class Special : public class Super
    {
        virtual int getType() { return 2; }
    }
    class SpecialSpecial : public class Special
    {
        virtual int getType() { return 3; }
    }
    

    我有一个函数需要 std::vector<Super*> 作为参数:

    void handleClasses( std::vector<Super*> superVector )
    {
        foreach element in superVector //Pseudocode!!
        {
            if( element->getType() == 1 )
                std::cout << "Thats a SuperClass" << std::endl;
            else if( element->getType() == 2 )
                std::cout << "Thats a SpecialClass" << std::endl;
            else if( element->getType() == 3 )
                std::cout << "Thats a SpecialSpecialClass" << std::endl;
        }
    }
    

    Special :

    class ParalellSpecial : public class Special
    {
        virtual int getType() { return 4; }
    }
    

    现在函数 handleClasses 特别的 ).

    注意:类型标识符仅用于演示目的。在C++中,有更好的方法来识别CLSASTPE。

    3 回复  |  直到 15 年前
        1
  •  2
  •   user9876    15 年前

    这里有两个可能的答案:

    1) 如果你认为你需要知道一个对象的真正类型,那么也许你的封装是错误的。也许handleClasses()应该调用对象的方法,而每个类应该提供不同的实现?

    2) 如果这是很少需要知道对象类型的情况,请使用 dynamic_cast<>

    void handleClasses( std::vector<Super*> superVector )
    {
        foreach element in superVector //Pseudocode!!
        {
            if( dynamic_cast<SpecialSpecial *>(element) != 0 )
                // SpecialSpecial or a subclass of SpecialSpecial 
                std::cout << "Thats a SpecialSpecialClass" << std::endl;
            else if( dynamic_cast<Special *>(element) != 0 )
                // Special or a subclass of Special
                std::cout << "Thats a SpecialClass" << std::endl;
            else
                // Super or a subclass of Super
                std::cout << "Thats a SuperClass" << std::endl;
        }
    }
    
        2
  •  0
  •   MOnsDaR    15 年前

    第一个解决办法就是让它动起来:

    子类将超类的类型集成到它们自己的type-ID中。
    - Super 获取类型==1
    Special 获取类型==21
    SpecialSpecial 获取类型==321
    - ParalellSpecial

    这个 handleClasses 现在检查第一个数字是否已知(不是 平行特殊 超级的 特别的

    这个概念的最大缺点是每个层次级别只能有10个类。我认为类型标识符的概念也不是最佳的。

    认为有更好的解决方案。

        3
  •  0
  •   Björn Pollex    15 年前

    另一个想法是创建一个全局类型注册表,它知道类型之间的关系。然后可以使用注册表在层次结构中移动,直到找到可以处理的类型。注册表可以只是一个DAG,类型ID为节点。