2009-07-07 77 views
0

我试图覆盖对象::的equals 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和State。如果我传递一个具有相同内容的状态,我希望我的Equals函数返回true。

我得到的状态是不一样的IState,但有没有一个运算符,这将允许我检查他们是否继承相同的基类? 也许重载运算符typeid 可能帮助,但它似乎有很多麻烦,

+3

对于它的价值,你违反了.NET的准则,通过一个名称前缀为I的类(这表明它是一个接口)。由于C++/CLI和C++是非常不同的野兽,因此 – 2009-07-07 19:35:07

+0

更改了标签。 :) – jalf 2009-07-07 19:35:51

+0

你为什么重写界面中的任何东西?接口不应该有实现。 – CodeFusionMobile 2009-07-07 19:36:24

回答

1

好,我设法得到它的工作

我错过了 - > BASETYPE()后 - >的GetType()

这里的工作版本

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

正确的方法是使用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。

相关问题