2009-07-07 79 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。

相關問題