C ++ CLI dynamic_cast和多重继承(Windows窗体和接口)

时间:2012-07-06 08:33:14

标签: c# winforms dynamic c++-cli multiple-inheritance

我正在使用的场景如下:

public interface INativeWindow { ... }

是本机窗口类型的接口,其具有一些必需的基本方法来实现以便具有最小窗口支持(例如,最小化,恢复等)。这是一个属于interfaces项目的C#接口。

现在我想在CLINativeWindow c ++ - cli类中实现它:

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

最后,我有另一个ref c ++ cli类,它有一个CLINativeWindow类型的内部成员和一个返回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中这根本不可能?

修改 附加代码:

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);}
            }
}

错误来自编译时,他们声明无法对getter和setter执行转换/强制转换(即无法从B ^转换为A ^,从B ^转换为A ^)。 的更新 如果类在不同的文件中,则在标头中实现该属性将不起作用。在单独的.cpp源文件中实现它不会再导致编译时错误,并且可以按预期工作。

1 个答案:

答案 0 :(得分: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_;
};