2012-07-06 98 views
0

的情況下我與長相如下工作:C++ CLI的dynamic_cast和多重繼承(Windows Forms和接口)

public interface INativeWindow { ... } 

是接口的原生窗口型保持了幾個要求,基本方法來實現爲了獲得最小的窗口支持(例如最小化,恢復等)。這是一個屬於接口項目的C#接口。

現在我要實現它在CLINativeWindow C++ - CLI類:

public ref class CLINativeWindow: public SWF::NativeWindow, INativeWindow 
{ 
... 
} 

最後,我有一個具有CLINativeWindow類型的內部成員,並返回一個包裹財產另一ref C++ CLI類INativeWindow^手柄:

virtual property INativeWindow^ OwnNativeWindow 
       { 
        INativeWindow^ __clrcall get() sealed { return NativeWindow;} 
        void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_cast<CLINativeWindow^>(value);} 
       } 

這裏的問題是,dynamic_cast不工作,也沒有從屬性的getter方法隱式多態垂頭喪氣。如果我沒有誤導,我想我在幾個地方看過,在C++中用正常的指針,這樣的錯誤確實有效。現在作爲一個SWF::NativeWindow是經典的windows窗體本地窗口類(關於意外的合併),它應該有一個虛擬方法,就像接口一樣,所以對於動態轉換運算符來說沒有問題,因爲涉及到多態繼承。我錯了,還是這在dotNet C++ CLI中根本不可能?

EDIT 附加代碼:

public ref class ExampleForSO 
{ 
    CLINativeWindow^ NativeWindow; 


virtual property INativeWindow^ OwnNativeWindow 
        { 
         INativeWindow^ __clrcall get() sealed { return NativeWindow;} 
         void __clrcall set(INativeWindow^ value) { NativeWindow = dynamic_c 

ast<CLINativeWindow^>(value);} 
      } 
} 

的錯誤是從編譯時和他們的狀態,轉換/鑄造不能用於二者獲取和設置(即,無法從B轉變進行^至A ^並從B ^到A ^)。 UPDATE 如果這些類在不同的文件中,那麼在頭中實現屬性將不會執行。在單獨的.cpp源文件中實現它不會再導致編譯時錯誤,並按需要工作。

回答

1

這裏沒有多重繼承。您的CLINativeWindow繼承自一個類:SWF::NativeWindow,並且它還實現INativeWindow接口。

您沒有提供足夠的信息(您得到了哪些錯誤?可以粘貼到VS中的示例代碼來重現問題?),但通常您發佈的代碼沒有任何問題。

我的猜測是,你NativeWindow被聲明爲:

CLINativeWindow NativeWindow; 

不急需的^。嘗試聲明爲:

CLINativeWindow^ NativeWindow; 

編輯

下完全編譯對我來說:

public interface class INativeWindow 
{}; 

public ref class SWFNativeWindow 
{}; 

public ref class CLINativeWindow : SWFNativeWindow, INativeWindow 
{}; 

public ref class NWHolder 
{ 
public: 
    virtual property INativeWindow^ OwnNativeWindow 
    { 
     INativeWindow^ __clrcall get() sealed { return nativeWindow_; } 
     void __clrcall set(INativeWindow^ w) { nativeWindow_ = dynamic_cast<CLINativeWindow^>(w); } 
    } 

private: 
    CLINativeWindow^ nativeWindow_; 
}; 
+0

我確實包括手柄符的類型。我認爲在C++ - CLI中沒有這樣的「實現接口」的概念,它與C++的「繼承抽象類」習語相似。這就是爲什麼我在標題中指定多重繼承的原因。此外,是否有可能使用'dynamic_cast'運算符將實現類轉換爲其''接口'句柄..當派生類也繼承另一個類時?這是主要問題,我根本不知道我在interweb上找到了什麼。謝謝! – teodron 2012-07-06 11:39:55

+0

感謝您的更新,而不是'SWFNativeWindow' ref類,您可以嘗試:'System :: Windows :: Forms :: NativeWindow'嗎?它應該沒問題,因爲'WndProc'是一個虛擬的保護方法..但對我來說,情況並非如此。 – teodron 2012-07-06 11:54:33

+0

感謝您的模擬代碼。這正是我所說的說明性場景,除了一個微小的區別外:我使用'System :: Windows :: Forms :: NativeClass','SWF'只是一個名稱空間別名。在這種情況下,演員失敗(但它應該像你一樣工作)。另外,我認爲要使用多態性進行強制轉換,至少需要一個基類中的虛擬方法。 – teodron 2012-07-06 11:58:37