0

我正在尝试覆盖 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。

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

4

4 回答 4

4

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

于 2009-07-07T19:43:05.280 回答
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。

于 2009-07-07T20:32:55.040 回答
1

好的,我设法让它工作

我在 ->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;
    }

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

于 2009-07-07T19:44:08.773 回答
0

使用 typeid 运算符怎么样? http://msdn.microsoft.com/en-us/library/fyf39xec(VS.80).aspx

于 2009-07-07T19:37:09.753 回答