我试图在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 可能帮助,但这似乎很麻烦
答案 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)
使用typeid运算符怎么样? http://msdn.microsoft.com/en-us/library/fyf39xec(VS.80).aspx