2011-10-27 59 views
3

的I型有一个C++应用程序,其具有以下类:从AAA C++获得对象

  • class CCC继承

    • class AAA
    • class BBB继承AAA
    • class DDD继承CCC

    (所有的类都被标记为public

    现在我有以下地图:

    map <DWORD, AAA*> 
    

    我发现在mapAAA对象,由DWORD id,但现在我想知道是AAA类型:

    这将是逻辑:

    if(AAA is BBB) 
    { 
    ... 
    } 
    if(AAA is CCC) 
    { 
    ... 
    } 
    if(AAA is DDD) 
    { 
    ... 
    } 
    

    你知道如何用C++编写它(不需要添加多态函数getType())吗?

  • +1

    为什么你需要知道类型? – Johnsyweb

    +4

    为什么需要?如果你的类是多态的,那么编译器会为你做其余的事情。 – DumbCoder

    回答

    4

    如果您的对象是多态的(即至少有一个虚拟功能),请执行dynamic_cast<T*>

    如果结果不是NULL那么你有一个T类型的对象。但是一个虚拟功能将会是更好的去IMO的方式。

    注:RTTI将需要enabled on your compiler(它会在绝大多数情况)

    编辑:感谢@Als和@flipchart用于补充

    +1

    'dynamic_cast'仅适用于多态类。 'typeid()'也是如此,这可能会给非多态层次结构带来错误的结果。 –

    +0

    dynamic_cast指针将返回null。在引用上,它会抛出一个异常。另请注意,这需要运行时间类型标识(RTTI) – flipchart

    7

    需要这表明你正在做它错误的方法。您正试图复制虚拟方法的发明。只需在你的基类中添加一个虚拟方法。

    class AAA 
    { 
    public: 
        virtual void DoSomething() = 0; 
    } 
    
    class BBB : public AAA 
    { 
    public: 
        void DoSomething() { ... } 
    } 
    
    class CCC : public AAA 
    { 
    public: 
        void DoSomething() { ... } 
    } 
    
    class DDD : public AAA 
    { 
    public: 
        void DoSomething() { ... } 
    } 
    

    而在你的调用代码,你的逻辑很简单:

    // no need for if() blocks. it's the point of virtual methods. 
    AAA* somePointer; 
    ... 
    somePointer->DoSomething(); 
    

    我知道你也许不能只是复制/粘贴您当前的“DoSomething的”代码到这一点。但这是你应该用于这种情况的模式。也许而不是DoSomething这样做更有意义,像GetSomeInfo这样的东西,调用者可以用它来做任何需要做的事情。这种模式的具体用法取决于你的上下文。