2009-08-14 135 views
5

我有組件的一個有趣的堆棧我想把他們放在一起:C#和C++類的繼承交織

  1. 通用組件(C#或C++ - CLI)

    public class MyBase 
    { 
    public void MethodA() 
    { ... } 
    private void MethodB() 
    { ... } 
    protected virtual MethodC() 
    { ... } 
    } 
    
  2. 測試代碼組件(所有的C++ - CLI)

    public class MySpecific : public MyBase{ 
    protected: override MethodC(); 
    }; 
    
  3. 測試模擬器(C#)

    MySpecific obj = new MySpecific(); 
    obj.MethodC(); 
    

雖然組件1可能是C++ - CLI讓事情變得更簡單,我真的很想保持組件3在C#。這在很大程度上是一個練習,以查看繼承是否可以在任何一個方向上完成,但是我也有一個真實世界的情況,這個堆棧很有用。

我發現的第一個問題是,C++-CLI程序集不能編譯,因爲它不能將MyBase識別爲一個類,儘管我有一個對程序集1的引用以及看起來像是正確的名稱空間。

如何編寫語言可移植的類?

回答

4

我認爲你必須聲明MySpecific因爲這樣的管理類:

public ref class MySpecific : public MyBase { ... } 

詳見CLI/C++文檔。你將無法在不做修改的情況下使用舊的C++代碼,但我認爲你所想的一切都應該是可能的。

1

這樣可以正常工作,但是如果您使用託管類型(即:從C#類繼承),則需要使用C++/CLI語法。所以,在這種情況下,在第2項應該看起來更像:

public ref class MySpecific : public MyBase { ... } 

確保文件使用/ clr編譯非常。

這裏是tutorial describing inheritance in C++/CLI

+1

如何讓C++編譯器查看MyBase?我一直得到「C2504:'Mybase':基類未定義」 – Foozinator 2009-08-14 17:42:05

+0

確保將它添加爲參考,並且您已使用/ clr編譯此文件。另外,確保你正在使用(或使用)適當的命名空間。這聽起來像你不在使用相同命名空間的部分。您可以完全限定MyBase - 即:公共ref類MySpecific:公共MyNamespace :: MyBase {...} – 2009-08-14 18:41:00

3

找到了答案:

`#using "..\common\bin\debug\common.dll"` 

也就是說,除了/ clr開關(需要被mananged C++的一側)似乎是工作,那麼遠。