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

如何检查两个对象是否继承自同一个基类?

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

    我试图在C++.NET中重写对象::相等,但我遇到了一些困难。

    virtual bool IState::Equals(Object^ o) override{
            if (o->GetType() == IState::typeid){
                IState^ s = (IState^) o;
                if (s->type == this->type &&
                    s->target_state == this->target_state &&
                    s->current_state == this->current_state){
                    return true;
                }
                else{
                    return false;
                }
            }
            return false;
        }
    

    如果o是和istate,则此代码工作正常。然而,我继承了国家的遗产。如果传递具有相同内容的状态,我希望equals函数返回true。

    我得到的状态与IState不同,但是是否有一个操作符允许我检查它们是否继承自同一个基类? 可能重载了运算符typeid 可以 帮个忙,但这似乎很麻烦

    4 回复  |  直到 15 年前
        1
  •  4
  •   Steve Guidi    15 年前

    使用反射是一种选择吗?如果是,请看 Type::IsAssignableFrom() 方法和 Type::BaseType 财产。

        2
  •  3
  •   Pavel Minaev    15 年前

    正确的方法是使用动态强制转换,并检查nullptr:

    virtual bool IState::Equals(Object^ o) override {
        IState^ s = dynamic_cast<IState^>(o);
        if (s != nullptr) {
            ...
        }
        return false;
    }
    

    您使用的C样式的强制转换(避免使用那些btw)实际上会执行一个安全的强制转换,它在失败时抛出invalidCastException,因此您必须显式地拼写出动态强制转换。

        3
  •  1
  •   Eric    15 年前

    好吧,我设法让它工作了

    我在getType()之后缺少->baseType()。

    这是工作版本

    virtual bool IState::Equals(Object^ o) override{
            if (o->GetType()->BaseType() == IState::typeid){
                    IState^ s = (IState^) o;
                    if (s->type == this->type &&
                            s->target_state == this->target_state &&
                            s->current_state == this->current_state){
                            return true;
                    }
                    else{
                            return false;
                    }
            }
            return false;
        }
    

    感谢你们所有的时间,支持和奉献=)

        4
  •  0
  •   Tamar    15 年前