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

时间:2009-07-07 19:32:09

标签: .net inheritance c++-cli override overloading

我试图在C ++ .NET中覆盖Object :: Equals,但我遇到了一些困难

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,此代码可以正常工作。但是,我从国家继承了IState。如果我传递一个具有相同内容的State,我希望我的Equals函数返回true。

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

4 个答案:

答案 0 :(得分:4)

使用反射是一种选择吗?如果是这样,请查看Type::IsAssignableFrom()方法和Type::BaseType属性。

答案 1 :(得分:3)

执行此操作的正确方法是使用dynamic_cast,并检查nullptr:

virtual bool IState::Equals(Object^ o) override {
    IState^ s = dynamic_cast<IState^>(o);
    if (s != nullptr) {
        ...
    }
    return false;
}
你使用过的C风格的强制转换(避免那些BTW)实际上会执行一个safe_cast,它会在失败时抛出InvalidCastException,所以你必须明确地拼出dynamic_cast。

答案 2 :(得分:1)

好的,我设法让它上班

我在 - &gt; GetType()

之后缺少 - &gt; 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;
    }

谢谢大家的时间,支持和奉献=)

答案 3 :(得分:0)