的情況下我與長相如下工作: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
源文件中實現它不會再導致編譯時錯誤,並按需要工作。
我確實包括手柄符的類型。我認爲在C++ - CLI中沒有這樣的「實現接口」的概念,它與C++的「繼承抽象類」習語相似。這就是爲什麼我在標題中指定多重繼承的原因。此外,是否有可能使用'dynamic_cast'運算符將實現類轉換爲其''接口'句柄..當派生類也繼承另一個類時?這是主要問題,我根本不知道我在interweb上找到了什麼。謝謝! – teodron 2012-07-06 11:39:55
感謝您的更新,而不是'SWFNativeWindow' ref類,您可以嘗試:'System :: Windows :: Forms :: NativeWindow'嗎?它應該沒問題,因爲'WndProc'是一個虛擬的保護方法..但對我來說,情況並非如此。 – teodron 2012-07-06 11:54:33
感謝您的模擬代碼。這正是我所說的說明性場景,除了一個微小的區別外:我使用'System :: Windows :: Forms :: NativeClass','SWF'只是一個名稱空間別名。在這種情況下,演員失敗(但它應該像你一樣工作)。另外,我認爲要使用多態性進行強制轉換,至少需要一個基類中的虛擬方法。 – teodron 2012-07-06 11:58:37